Commit c90176df authored by Linus Torvalds's avatar Linus Torvalds

Manual merge

parents a6f5ccdf 6a8061e8
...@@ -54,7 +54,7 @@ struct safe_buffer { ...@@ -54,7 +54,7 @@ struct safe_buffer {
dma_addr_t safe_dma_addr; dma_addr_t safe_dma_addr;
}; };
LIST_HEAD(safe_buffers); static LIST_HEAD(safe_buffers);
#define SIZE_SMALL 1024 #define SIZE_SMALL 1024
......
...@@ -218,7 +218,7 @@ static void sa1111_unmask_lowirq(unsigned int irq) ...@@ -218,7 +218,7 @@ static void sa1111_unmask_lowirq(unsigned int irq)
* be triggered. In fact, its very difficult, if not impossible to get * be triggered. In fact, its very difficult, if not impossible to get
* INTSET to re-trigger the interrupt. * INTSET to re-trigger the interrupt.
*/ */
static void sa1111_rerun_lowirq(unsigned int irq) static int sa1111_retrigger_lowirq(unsigned int irq)
{ {
unsigned int mask = SA1111_IRQMASK_LO(irq); unsigned int mask = SA1111_IRQMASK_LO(irq);
int i; int i;
...@@ -233,6 +233,7 @@ static void sa1111_rerun_lowirq(unsigned int irq) ...@@ -233,6 +233,7 @@ static void sa1111_rerun_lowirq(unsigned int irq)
if (i == 8) if (i == 8)
printk(KERN_ERR "Danger Will Robinson: failed to " printk(KERN_ERR "Danger Will Robinson: failed to "
"re-trigger IRQ%d\n", irq); "re-trigger IRQ%d\n", irq);
return i == 8 ? -1 : 0;
} }
static int sa1111_type_lowirq(unsigned int irq, unsigned int flags) static int sa1111_type_lowirq(unsigned int irq, unsigned int flags)
...@@ -270,7 +271,7 @@ static struct irqchip sa1111_low_chip = { ...@@ -270,7 +271,7 @@ static struct irqchip sa1111_low_chip = {
.ack = sa1111_ack_irq, .ack = sa1111_ack_irq,
.mask = sa1111_mask_lowirq, .mask = sa1111_mask_lowirq,
.unmask = sa1111_unmask_lowirq, .unmask = sa1111_unmask_lowirq,
.rerun = sa1111_rerun_lowirq, .retrigger = sa1111_retrigger_lowirq,
.type = sa1111_type_lowirq, .type = sa1111_type_lowirq,
.wake = sa1111_wake_lowirq, .wake = sa1111_wake_lowirq,
}; };
...@@ -292,7 +293,7 @@ static void sa1111_unmask_highirq(unsigned int irq) ...@@ -292,7 +293,7 @@ static void sa1111_unmask_highirq(unsigned int irq)
* be triggered. In fact, its very difficult, if not impossible to get * be triggered. In fact, its very difficult, if not impossible to get
* INTSET to re-trigger the interrupt. * INTSET to re-trigger the interrupt.
*/ */
static void sa1111_rerun_highirq(unsigned int irq) static int sa1111_retrigger_highirq(unsigned int irq)
{ {
unsigned int mask = SA1111_IRQMASK_HI(irq); unsigned int mask = SA1111_IRQMASK_HI(irq);
int i; int i;
...@@ -307,6 +308,7 @@ static void sa1111_rerun_highirq(unsigned int irq) ...@@ -307,6 +308,7 @@ static void sa1111_rerun_highirq(unsigned int irq)
if (i == 8) if (i == 8)
printk(KERN_ERR "Danger Will Robinson: failed to " printk(KERN_ERR "Danger Will Robinson: failed to "
"re-trigger IRQ%d\n", irq); "re-trigger IRQ%d\n", irq);
return i == 8 ? -1 : 0;
} }
static int sa1111_type_highirq(unsigned int irq, unsigned int flags) static int sa1111_type_highirq(unsigned int irq, unsigned int flags)
...@@ -344,7 +346,7 @@ static struct irqchip sa1111_high_chip = { ...@@ -344,7 +346,7 @@ static struct irqchip sa1111_high_chip = {
.ack = sa1111_ack_irq, .ack = sa1111_ack_irq,
.mask = sa1111_mask_highirq, .mask = sa1111_mask_highirq,
.unmask = sa1111_unmask_highirq, .unmask = sa1111_unmask_highirq,
.rerun = sa1111_rerun_highirq, .retrigger = sa1111_retrigger_highirq,
.type = sa1111_type_highirq, .type = sa1111_type_highirq,
.wake = sa1111_wake_highirq, .wake = sa1111_wake_highirq,
}; };
......
# #
# Automatically generated by make menuconfig: don't edit # Automatically generated make config: don't edit
# #
CONFIG_ARM=y CONFIG_ARM=y
# CONFIG_EISA is not set CONFIG_MMU=y
# CONFIG_SBUS is not set CONFIG_SWAP=y
# CONFIG_MCA is not set
CONFIG_UID16=y CONFIG_UID16=y
CONFIG_RWSEM_GENERIC_SPINLOCK=y CONFIG_RWSEM_GENERIC_SPINLOCK=y
# CONFIG_RWSEM_XCHGADD_ALGORITHM is not set
# CONFIG_GENERIC_BUST_SPINLOCK is not set
# CONFIG_GENERIC_ISA_DMA is not set
# #
# Code maturity level options # Code maturity level options
# #
CONFIG_EXPERIMENTAL=y CONFIG_EXPERIMENTAL=y
# CONFIG_OBSOLETE is not set
#
# General setup
#
CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y
CONFIG_LOG_BUF_SHIFT=14
# #
# Loadable module support # Loadable module support
# #
CONFIG_MODULES=y CONFIG_MODULES=y
# CONFIG_MODVERSIONS is not set # CONFIG_MODULE_UNLOAD is not set
CONFIG_OBSOLETE_MODPARM=y
# CONFIG_KMOD is not set # CONFIG_KMOD is not set
# #
...@@ -33,6 +37,7 @@ CONFIG_MODULES=y ...@@ -33,6 +37,7 @@ CONFIG_MODULES=y
# CONFIG_ARCH_CLPS7500 is not set # CONFIG_ARCH_CLPS7500 is not set
# CONFIG_ARCH_CLPS711X is not set # CONFIG_ARCH_CLPS711X is not set
# CONFIG_ARCH_CO285 is not set # CONFIG_ARCH_CO285 is not set
# CONFIG_ARCH_PXA is not set
# CONFIG_ARCH_EBSA110 is not set # CONFIG_ARCH_EBSA110 is not set
CONFIG_ARCH_CAMELOT=y CONFIG_ARCH_CAMELOT=y
# CONFIG_ARCH_FOOTBRIDGE is not set # CONFIG_ARCH_FOOTBRIDGE is not set
...@@ -46,106 +51,71 @@ CONFIG_ARCH_CAMELOT=y ...@@ -46,106 +51,71 @@ CONFIG_ARCH_CAMELOT=y
# #
# Archimedes/A5000 Implementations # Archimedes/A5000 Implementations
# #
# CONFIG_ARCH_ARC is not set
# CONFIG_ARCH_A5K is not set #
# Archimedes/A5000 Implementations (select only ONE)
#
#
# CLPS711X/EP721X Implementations
#
#
# Epxa10db
#
#
# PLD hotswap support
#
CONFIG_PLD=y
# CONFIG_PLD_HOTSWAP is not set
# #
# Footbridge Implementations # Footbridge Implementations
# #
# CONFIG_ARCH_CATS is not set
# CONFIG_ARCH_PERSONAL_SERVER is not set #
# CONFIG_ARCH_EBSA285_ADDIN is not set # IOP310 Implementation Options
# CONFIG_ARCH_EBSA285_HOST is not set #
# CONFIG_ARCH_NETWINDER is not set
#
# IOP310 Chipset Features
#
#
# Intel PXA250/210 Implementations
#
# #
# SA11x0 Implementations # SA11x0 Implementations
# #
# CONFIG_SA1100_ASSABET is not set
# CONFIG_ASSABET_NEPONSET is not set
# CONFIG_SA1100_ADSBITSY is not set
# CONFIG_SA1100_BRUTUS is not set
# CONFIG_SA1100_CERF is not set
# CONFIG_SA1100_H3100 is not set
# CONFIG_SA1100_H3600 is not set
# CONFIG_SA1100_H3800 is not set
# CONFIG_SA1100_H3XXX is not set
# CONFIG_SA1100_EXTENEX1 is not set
# CONFIG_SA1100_FLEXANET is not set
# CONFIG_SA1100_FREEBIRD is not set
# CONFIG_SA1100_GRAPHICSCLIENT is not set
# CONFIG_SA1100_GRAPHICSMASTER is not set
# CONFIG_SA1100_BADGE4 is not set
# CONFIG_SA1100_JORNADA720 is not set
# CONFIG_SA1100_HUW_WEBPANEL is not set
# CONFIG_SA1100_ITSY is not set
# CONFIG_SA1100_LART is not set
# CONFIG_SA1100_NANOENGINE is not set
# CONFIG_SA1100_OMNIMETER is not set
# CONFIG_SA1100_PANGOLIN is not set
# CONFIG_SA1100_PLEB is not set
# CONFIG_SA1100_PT_SYSTEM3 is not set
# CONFIG_SA1100_SHANNON is not set
# CONFIG_SA1100_SHERMAN is not set
# CONFIG_SA1100_SIMPAD is not set
# CONFIG_SA1100_PFS168 is not set
# CONFIG_SA1100_VICTOR is not set
# CONFIG_SA1100_XP860 is not set
# CONFIG_SA1100_YOPY is not set
# CONFIG_SA1100_USB is not set
# CONFIG_SA1100_USB_NETLINK is not set
# CONFIG_SA1100_USB_CHAR is not set
# CONFIG_H3600_SLEEVE is not set
# #
# CLPS711X/EP721X Implementations # Processor Type
# #
# CONFIG_ARCH_AUTCPU12 is not set
# CONFIG_ARCH_CDB89712 is not set
# CONFIG_ARCH_CLEP7312 is not set
# CONFIG_ARCH_EDB7211 is not set
# CONFIG_ARCH_P720T is not set
# CONFIG_ARCH_FORTUNET is not set
# CONFIG_ARCH_EP7211 is not set
# CONFIG_ARCH_EP7212 is not set
# CONFIG_ARCH_ACORN is not set
# CONFIG_FOOTBRIDGE is not set
# CONFIG_FOOTBRIDGE_HOST is not set
# CONFIG_FOOTBRIDGE_ADDIN is not set
CONFIG_CPU_32=y CONFIG_CPU_32=y
# CONFIG_CPU_26 is not set
# CONFIG_CPU_32v3 is not set
CONFIG_CPU_32v4=y
# CONFIG_CPU_ARM610 is not set
# CONFIG_CPU_ARM710 is not set
# CONFIG_CPU_ARM720T is not set
# CONFIG_CPU_ARM920T is not set
CONFIG_CPU_ARM922T=y CONFIG_CPU_ARM922T=y
CONFIG_CPU_ARM922_CPU_IDLE=y CONFIG_CPU_32v4=y
CONFIG_CPU_ARM922_I_CACHE_ON=y
CONFIG_CPU_ARM922_D_CACHE_ON=y #
# CONFIG_CPU_ARM922_WRITETHROUGH is not set # Processor Features
# CONFIG_CPU_ARM926T is not set #
# CONFIG_CPU_ARM1020 is not set
# CONFIG_CPU_SA110 is not set
# CONFIG_CPU_SA1100 is not set
# CONFIG_XSCALE_PMU is not set
# CONFIG_ARM_THUMB is not set # CONFIG_ARM_THUMB is not set
# CONFIG_DISCONTIGMEM is not set # CONFIG_CPU_ICACHE_DISABLE is not set
# CONFIG_CPU_DCACHE_DISABLE is not set
# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
# #
# General setup # General setup
# #
# CONFIG_PCI is not set # CONFIG_ZBOOT_ROM is not set
# CONFIG_ISA is not set CONFIG_ZBOOT_ROM_TEXT=0
# CONFIG_ISA_DMA is not set CONFIG_ZBOOT_ROM_BSS=0
# CONFIG_FIQ is not set
# CONFIG_HOTPLUG is not set # CONFIG_HOTPLUG is not set
# CONFIG_PCMCIA is not set
CONFIG_NET=y #
CONFIG_SYSVIPC=y # At least one math emulation must be selected
# CONFIG_BSD_PROCESS_ACCT is not set #
CONFIG_SYSCTL=y
CONFIG_FPE_NWFPE=y CONFIG_FPE_NWFPE=y
# CONFIG_FPE_FASTFPE is not set # CONFIG_FPE_FASTFPE is not set
CONFIG_KCORE_ELF=y CONFIG_KCORE_ELF=y
...@@ -154,7 +124,7 @@ CONFIG_BINFMT_AOUT=y ...@@ -154,7 +124,7 @@ CONFIG_BINFMT_AOUT=y
CONFIG_BINFMT_ELF=y CONFIG_BINFMT_ELF=y
# CONFIG_BINFMT_MISC is not set # CONFIG_BINFMT_MISC is not set
# CONFIG_PM is not set # CONFIG_PM is not set
# CONFIG_APM is not set # CONFIG_PREEMPT is not set
# CONFIG_ARTHUR is not set # CONFIG_ARTHUR is not set
CONFIG_CMDLINE="mem=32M console=ttyUA0,38400 root=/dev/mtdblock0 rw" CONFIG_CMDLINE="mem=32M console=ttyUA0,38400 root=/dev/mtdblock0 rw"
CONFIG_ALIGNMENT_TRAP=y CONFIG_ALIGNMENT_TRAP=y
...@@ -171,9 +141,14 @@ CONFIG_MTD=y ...@@ -171,9 +141,14 @@ CONFIG_MTD=y
CONFIG_MTD_DEBUG=y CONFIG_MTD_DEBUG=y
CONFIG_MTD_DEBUG_VERBOSE=0 CONFIG_MTD_DEBUG_VERBOSE=0
CONFIG_MTD_PARTITIONS=y CONFIG_MTD_PARTITIONS=y
# CONFIG_MTD_CONCAT is not set
# CONFIG_MTD_REDBOOT_PARTS is not set # CONFIG_MTD_REDBOOT_PARTS is not set
CONFIG_MTD_BOOTLDR_PARTS=y # CONFIG_MTD_CMDLINE_PARTS is not set
# CONFIG_MTD_AFS_PARTS is not set # CONFIG_MTD_AFS_PARTS is not set
#
# User Modules And Translation Layers
#
CONFIG_MTD_CHAR=y CONFIG_MTD_CHAR=y
CONFIG_MTD_BLOCK=y CONFIG_MTD_BLOCK=y
# CONFIG_FTL is not set # CONFIG_FTL is not set
...@@ -192,9 +167,6 @@ CONFIG_MTD_CFI_INTELEXT=y ...@@ -192,9 +167,6 @@ CONFIG_MTD_CFI_INTELEXT=y
# CONFIG_MTD_ROM is not set # CONFIG_MTD_ROM is not set
# CONFIG_MTD_ABSENT is not set # CONFIG_MTD_ABSENT is not set
# CONFIG_MTD_OBSOLETE_CHIPS is not set # CONFIG_MTD_OBSOLETE_CHIPS is not set
# CONFIG_MTD_AMDSTD is not set
# CONFIG_MTD_SHARP is not set
# CONFIG_MTD_JEDEC is not set
# #
# Mapping drivers for chip access # Mapping drivers for chip access
...@@ -202,24 +174,23 @@ CONFIG_MTD_CFI_INTELEXT=y ...@@ -202,24 +174,23 @@ CONFIG_MTD_CFI_INTELEXT=y
# CONFIG_MTD_PHYSMAP is not set # CONFIG_MTD_PHYSMAP is not set
# CONFIG_MTD_NORA is not set # CONFIG_MTD_NORA is not set
# CONFIG_MTD_ARM_INTEGRATOR is not set # CONFIG_MTD_ARM_INTEGRATOR is not set
# CONFIG_MTD_CDB89712 is not set
# CONFIG_MTD_SA1100 is not set
# CONFIG_MTD_DC21285 is not set
# CONFIG_MTD_IQ80310 is not set
CONFIG_MTD_EPXA10DB=y CONFIG_MTD_EPXA10DB=y
# CONFIG_MTD_PCI is not set # CONFIG_MTD_EDB7312 is not set
# CONFIG_MTD_UCLINUX is not set
# #
# Self-contained MTD device drivers # Self-contained MTD device drivers
# #
# CONFIG_MTD_PMC551 is not set
# CONFIG_MTD_SLRAM is not set # CONFIG_MTD_SLRAM is not set
# CONFIG_MTD_MTDRAM is not set # CONFIG_MTD_MTDRAM is not set
# CONFIG_MTD_BLKMTD is not set # CONFIG_MTD_BLKMTD is not set
#
# Disk-On-Chip Device Drivers
#
# CONFIG_MTD_DOC1000 is not set # CONFIG_MTD_DOC1000 is not set
# CONFIG_MTD_DOC2000 is not set # CONFIG_MTD_DOC2000 is not set
# CONFIG_MTD_DOC2001 is not set # CONFIG_MTD_DOC2001 is not set
# CONFIG_MTD_DOCPROBE is not set
# #
# NAND Flash Device Drivers # NAND Flash Device Drivers
...@@ -227,21 +198,14 @@ CONFIG_MTD_EPXA10DB=y ...@@ -227,21 +198,14 @@ CONFIG_MTD_EPXA10DB=y
# CONFIG_MTD_NAND is not set # CONFIG_MTD_NAND is not set
# #
# Plug and Play configuration # Plug and Play support
# #
# CONFIG_PNP is not set # CONFIG_PNP is not set
# CONFIG_ISAPNP is not set
# #
# Block devices # Block devices
# #
# CONFIG_BLK_DEV_FD is not set # CONFIG_BLK_DEV_FD is not set
# CONFIG_BLK_DEV_XD is not set
# CONFIG_PARIDE is not set
# CONFIG_BLK_CPQ_DA is not set
# CONFIG_BLK_CPQ_CISS_DA is not set
# CONFIG_CISS_SCSI_TAPE is not set
# CONFIG_BLK_DEV_DAC960 is not set
# CONFIG_BLK_DEV_LOOP is not set # CONFIG_BLK_DEV_LOOP is not set
# CONFIG_BLK_DEV_NBD is not set # CONFIG_BLK_DEV_NBD is not set
CONFIG_BLK_DEV_RAM=y CONFIG_BLK_DEV_RAM=y
...@@ -252,23 +216,22 @@ CONFIG_BLK_DEV_RAM_SIZE=8192 ...@@ -252,23 +216,22 @@ CONFIG_BLK_DEV_RAM_SIZE=8192
# Multi-device support (RAID and LVM) # Multi-device support (RAID and LVM)
# #
# CONFIG_MD is not set # CONFIG_MD is not set
# CONFIG_BLK_DEV_MD is not set
# CONFIG_MD_LINEAR is not set #
# CONFIG_MD_RAID0 is not set # Networking support
# CONFIG_MD_RAID1 is not set #
# CONFIG_MD_RAID5 is not set CONFIG_NET=y
# CONFIG_MD_MULTIPATH is not set
# CONFIG_BLK_DEV_LVM is not set
# #
# Networking options # Networking options
# #
CONFIG_PACKET=y CONFIG_PACKET=y
# CONFIG_PACKET_MMAP is not set # CONFIG_PACKET_MMAP is not set
# CONFIG_NETLINK is not set # CONFIG_NETLINK_DEV is not set
# CONFIG_NETFILTER is not set # CONFIG_NETFILTER is not set
# CONFIG_FILTER is not set # CONFIG_FILTER is not set
CONFIG_UNIX=y CONFIG_UNIX=y
# CONFIG_NET_KEY is not set
CONFIG_INET=y CONFIG_INET=y
# CONFIG_IP_MULTICAST is not set # CONFIG_IP_MULTICAST is not set
# CONFIG_IP_ADVANCED_ROUTER is not set # CONFIG_IP_ADVANCED_ROUTER is not set
...@@ -278,19 +241,26 @@ CONFIG_IP_PNP_BOOTP=y ...@@ -278,19 +241,26 @@ CONFIG_IP_PNP_BOOTP=y
# CONFIG_IP_PNP_RARP is not set # CONFIG_IP_PNP_RARP is not set
# CONFIG_NET_IPIP is not set # CONFIG_NET_IPIP is not set
# CONFIG_NET_IPGRE is not set # CONFIG_NET_IPGRE is not set
# CONFIG_ARPD is not set
# CONFIG_INET_ECN is not set # CONFIG_INET_ECN is not set
# CONFIG_SYN_COOKIES is not set # CONFIG_SYN_COOKIES is not set
# CONFIG_INET_AH is not set
# CONFIG_INET_ESP is not set
# CONFIG_XFRM_USER is not set
# CONFIG_IPV6 is not set # CONFIG_IPV6 is not set
# CONFIG_KHTTPD is not set
#
# SCTP Configuration (EXPERIMENTAL)
#
CONFIG_IPV6_SCTP__=y
# CONFIG_IP_SCTP is not set
# CONFIG_ATM is not set # CONFIG_ATM is not set
# CONFIG_VLAN_8021Q is not set # CONFIG_VLAN_8021Q is not set
# CONFIG_IPX is not set # CONFIG_LLC is not set
# CONFIG_ATALK is not set
# CONFIG_DECNET is not set # CONFIG_DECNET is not set
# CONFIG_BRIDGE is not set # CONFIG_BRIDGE is not set
# CONFIG_X25 is not set # CONFIG_X25 is not set
# CONFIG_LAPB is not set # CONFIG_LAPB is not set
# CONFIG_LLC is not set
# CONFIG_NET_DIVERT is not set # CONFIG_NET_DIVERT is not set
# CONFIG_ECONET is not set # CONFIG_ECONET is not set
# CONFIG_WAN_ROUTER is not set # CONFIG_WAN_ROUTER is not set
...@@ -303,54 +273,27 @@ CONFIG_IP_PNP_BOOTP=y ...@@ -303,54 +273,27 @@ CONFIG_IP_PNP_BOOTP=y
# CONFIG_NET_SCHED is not set # CONFIG_NET_SCHED is not set
# #
# Network device support # Network testing
# #
# CONFIG_NET_PKTGEN is not set
CONFIG_NETDEVICES=y CONFIG_NETDEVICES=y
#
# ARCnet devices
#
# CONFIG_ARCNET is not set
# CONFIG_DUMMY is not set # CONFIG_DUMMY is not set
# CONFIG_BONDING is not set # CONFIG_BONDING is not set
# CONFIG_EQUALIZER is not set # CONFIG_EQUALIZER is not set
# CONFIG_TUN is not set # CONFIG_TUN is not set
# CONFIG_ETHERTAP is not set
# #
# Ethernet (10 or 100Mbit) # Ethernet (10 or 100Mbit)
# #
CONFIG_NET_ETHERNET=y CONFIG_NET_ETHERNET=y
# CONFIG_ARM_AM79C961A is not set
CONFIG_ETHER00=m CONFIG_ETHER00=m
# CONFIG_SUNLANCE is not set
# CONFIG_SUNBMAC is not set
# CONFIG_SUNQE is not set
# CONFIG_SUNLANCE is not set
# CONFIG_SUNGEM is not set
# CONFIG_NET_VENDOR_3COM is not set
# CONFIG_LANCE is not set
# CONFIG_NET_VENDOR_SMC is not set
# CONFIG_NET_VENDOR_RACAL is not set
# CONFIG_NET_ISA is not set
# CONFIG_NET_PCI is not set
# CONFIG_NET_POCKET is not set
# #
# Ethernet (1000 Mbit) # Ethernet (1000 Mbit)
# #
# CONFIG_ACENIC is not set
# CONFIG_DL2K is not set
# CONFIG_MYRI_SBUS is not set
# CONFIG_NS83820 is not set
# CONFIG_HAMACHI is not set
# CONFIG_YELLOWFIN is not set
# CONFIG_SK98LIN is not set
# CONFIG_FDDI is not set
# CONFIG_HIPPI is not set
# CONFIG_PLIP is not set
CONFIG_PPP=y CONFIG_PPP=y
CONFIG_PPP_MULTILINK=y CONFIG_PPP_MULTILINK=y
# CONFIG_PPP_FILTER is not set
CONFIG_PPP_ASYNC=y CONFIG_PPP_ASYNC=y
CONFIG_PPP_SYNC_TTY=y CONFIG_PPP_SYNC_TTY=y
# CONFIG_PPP_DEFLATE is not set # CONFIG_PPP_DEFLATE is not set
...@@ -364,11 +307,8 @@ CONFIG_PPP_SYNC_TTY=y ...@@ -364,11 +307,8 @@ CONFIG_PPP_SYNC_TTY=y
# CONFIG_NET_RADIO is not set # CONFIG_NET_RADIO is not set
# #
# Token Ring devices # Token Ring devices (depends on LLC=y)
# #
# CONFIG_TR is not set
# CONFIG_NET_FC is not set
# CONFIG_RCPCI is not set
# CONFIG_SHAPER is not set # CONFIG_SHAPER is not set
# #
...@@ -377,21 +317,19 @@ CONFIG_PPP_SYNC_TTY=y ...@@ -377,21 +317,19 @@ CONFIG_PPP_SYNC_TTY=y
# CONFIG_WAN is not set # CONFIG_WAN is not set
# #
# Amateur Radio support # IrDA (infrared) support
# #
# CONFIG_HAMRADIO is not set # CONFIG_IRDA is not set
# #
# IrDA (infrared) support # Amateur Radio support
# #
# CONFIG_IRDA is not set # CONFIG_HAMRADIO is not set
# #
# ATA/IDE/MFM/RLL support # ATA/ATAPI/MFM/RLL support
# #
# CONFIG_IDE is not set # CONFIG_IDE is not set
# CONFIG_BLK_DEV_IDE_MODES is not set
# CONFIG_BLK_DEV_HD is not set
# #
# SCSI support # SCSI support
...@@ -402,59 +340,48 @@ CONFIG_PPP_SYNC_TTY=y ...@@ -402,59 +340,48 @@ CONFIG_PPP_SYNC_TTY=y
# I2O device support # I2O device support
# #
# CONFIG_I2O is not set # CONFIG_I2O is not set
# CONFIG_I2O_BLOCK is not set
# CONFIG_I2O_LAN is not set
# CONFIG_I2O_SCSI is not set
# CONFIG_I2O_PROC is not set
# #
# ISDN subsystem # ISDN subsystem
# #
# CONFIG_ISDN is not set # CONFIG_ISDN_BOOL is not set
# #
# Input core support # Input device support
# #
# CONFIG_INPUT is not set # CONFIG_INPUT is not set
# CONFIG_INPUT_KEYBDEV is not set
# CONFIG_INPUT_MOUSEDEV is not set #
# CONFIG_INPUT_JOYDEV is not set # Userland interfaces
# CONFIG_INPUT_EVDEV is not set #
#
# Input I/O drivers
#
# CONFIG_GAMEPORT is not set
CONFIG_SOUND_GAMEPORT=y
# CONFIG_SERIO is not set
#
# Input Device Drivers
#
# #
# Character devices # Character devices
# #
# CONFIG_VT is not set
# CONFIG_SERIAL is not set
# CONFIG_SERIAL_EXTENDED is not set
# CONFIG_SERIAL_NONSTANDARD is not set # CONFIG_SERIAL_NONSTANDARD is not set
# #
# Serial drivers # Serial drivers
# #
# CONFIG_SERIAL_ANAKIN is not set # CONFIG_SERIAL_8250 is not set
# CONFIG_SERIAL_ANAKIN_CONSOLE is not set
# CONFIG_SERIAL_AMBA is not set #
# CONFIG_SERIAL_AMBA_CONSOLE is not set # Non-8250 serial port support
# CONFIG_SERIAL_CLPS711X is not set #
# CONFIG_SERIAL_CLPS711X_CONSOLE is not set # CONFIG_SERIAL_DZ is not set
# CONFIG_SERIAL_21285 is not set
# CONFIG_SERIAL_21285_OLD is not set
# CONFIG_SERIAL_21285_CONSOLE is not set
CONFIG_SERIAL_UART00=y CONFIG_SERIAL_UART00=y
CONFIG_SERIAL_UART00_CONSOLE=y CONFIG_SERIAL_UART00_CONSOLE=y
# CONFIG_SERIAL_SA1100 is not set
# CONFIG_SERIAL_SA1100_CONSOLE is not set
# CONFIG_SERIAL_8250 is not set
# CONFIG_SERIAL_8250_CONSOLE is not set
# CONFIG_ATOMWIDE_SERIAL is not set
# CONFIG_DUALSP_SERIAL is not set
# CONFIG_SERIAL_8250_EXTENDED is not set
# CONFIG_SERIAL_8250_MANY_PORTS is not set
# CONFIG_SERIAL_8250_SHARE_IRQ is not set
# CONFIG_SERIAL_8250_DETECT_IRQ is not set
# CONFIG_SERIAL_8250_MULTIPORT is not set
# CONFIG_SERIAL_8250_RSA is not set
CONFIG_SERIAL_CORE=y CONFIG_SERIAL_CORE=y
CONFIG_SERIAL_CORE_CONSOLE=y CONFIG_SERIAL_CORE_CONSOLE=y
CONFIG_UNIX98_PTYS=y CONFIG_UNIX98_PTYS=y
...@@ -465,34 +392,37 @@ CONFIG_UNIX98_PTY_COUNT=256 ...@@ -465,34 +392,37 @@ CONFIG_UNIX98_PTY_COUNT=256
# #
# CONFIG_I2C is not set # CONFIG_I2C is not set
#
# I2C Hardware Sensors Mainboard support
#
#
# I2C Hardware Sensors Chip support
#
# #
# L3 serial bus support # L3 serial bus support
# #
# CONFIG_L3 is not set # CONFIG_L3 is not set
# CONFIG_L3_ALGOBIT is not set
# CONFIG_L3_BIT_SA1100_GPIO is not set
# CONFIG_L3_SA1111 is not set
# CONFIG_BIT_SA1100_GPIO is not set
# #
# Mice # Mice
# #
# CONFIG_BUSMOUSE is not set # CONFIG_BUSMOUSE is not set
# CONFIG_MOUSE is not set # CONFIG_QIC02_TAPE is not set
# #
# Joysticks # IPMI
# #
# CONFIG_INPUT_GAMEPORT is not set # CONFIG_IPMI_HANDLER is not set
# CONFIG_QIC02_TAPE is not set
# #
# Watchdog Cards # Watchdog Cards
# #
# CONFIG_WATCHDOG is not set # CONFIG_WATCHDOG is not set
# CONFIG_INTEL_RNG is not set
# CONFIG_NVRAM is not set # CONFIG_NVRAM is not set
# CONFIG_RTC is not set # CONFIG_RTC is not set
# CONFIG_GEN_RTC is not set
# CONFIG_DTLK is not set # CONFIG_DTLK is not set
# CONFIG_R3964 is not set # CONFIG_R3964 is not set
# CONFIG_APPLICOM is not set # CONFIG_APPLICOM is not set
...@@ -503,6 +433,7 @@ CONFIG_UNIX98_PTY_COUNT=256 ...@@ -503,6 +433,7 @@ CONFIG_UNIX98_PTY_COUNT=256
# CONFIG_FTAPE is not set # CONFIG_FTAPE is not set
# CONFIG_AGP is not set # CONFIG_AGP is not set
# CONFIG_DRM is not set # CONFIG_DRM is not set
# CONFIG_RAW_DRIVER is not set
# #
# Multimedia devices # Multimedia devices
...@@ -516,50 +447,39 @@ CONFIG_UNIX98_PTY_COUNT=256 ...@@ -516,50 +447,39 @@ CONFIG_UNIX98_PTY_COUNT=256
# CONFIG_AUTOFS_FS is not set # CONFIG_AUTOFS_FS is not set
# CONFIG_AUTOFS4_FS is not set # CONFIG_AUTOFS4_FS is not set
# CONFIG_REISERFS_FS is not set # CONFIG_REISERFS_FS is not set
# CONFIG_REISERFS_CHECK is not set
# CONFIG_REISERFS_PROC_INFO is not set
# CONFIG_ADFS_FS is not set # CONFIG_ADFS_FS is not set
# CONFIG_ADFS_FS_RW is not set
# CONFIG_AFFS_FS is not set # CONFIG_AFFS_FS is not set
# CONFIG_HFS_FS is not set # CONFIG_HFS_FS is not set
# CONFIG_BEFS_FS is not set
# CONFIG_BFS_FS is not set # CONFIG_BFS_FS is not set
# CONFIG_EXT3_FS is not set # CONFIG_EXT3_FS is not set
# CONFIG_JBD is not set # CONFIG_JBD is not set
# CONFIG_JBD_DEBUG is not set
# CONFIG_FAT_FS is not set # CONFIG_FAT_FS is not set
# CONFIG_MSDOS_FS is not set
# CONFIG_UMSDOS_FS is not set
# CONFIG_VFAT_FS is not set
# CONFIG_EFS_FS is not set # CONFIG_EFS_FS is not set
# CONFIG_JFFS_FS is not set # CONFIG_JFFS_FS is not set
CONFIG_JFFS2_FS=y CONFIG_JFFS2_FS=y
CONFIG_JFFS2_FS_DEBUG=0 CONFIG_JFFS2_FS_DEBUG=0
# CONFIG_JFFS2_FS_NAND is not set
# CONFIG_CRAMFS is not set # CONFIG_CRAMFS is not set
CONFIG_TMPFS=y CONFIG_TMPFS=y
CONFIG_RAMFS=y CONFIG_RAMFS=y
# CONFIG_ISO9660_FS is not set # CONFIG_ISO9660_FS is not set
# CONFIG_JOLIET is not set # CONFIG_JFS_FS is not set
# CONFIG_ZISOFS is not set
# CONFIG_MINIX_FS is not set # CONFIG_MINIX_FS is not set
# CONFIG_VXFS_FS is not set # CONFIG_VXFS_FS is not set
# CONFIG_NTFS_FS is not set # CONFIG_NTFS_FS is not set
# CONFIG_NTFS_DEBUG is not set
# CONFIG_NTFS_RW is not set
# CONFIG_HPFS_FS is not set # CONFIG_HPFS_FS is not set
CONFIG_PROC_FS=y CONFIG_PROC_FS=y
# CONFIG_DEVFS_FS is not set # CONFIG_DEVFS_FS is not set
# CONFIG_DEVFS_MOUNT is not set
# CONFIG_DEVFS_DEBUG is not set
CONFIG_DEVPTS_FS=y CONFIG_DEVPTS_FS=y
# CONFIG_QNX4FS_FS is not set # CONFIG_QNX4FS_FS is not set
# CONFIG_QNX4FS_RW is not set
CONFIG_ROMFS_FS=y CONFIG_ROMFS_FS=y
CONFIG_EXT2_FS=y CONFIG_EXT2_FS=y
# CONFIG_EXT2_FS_XATTR is not set
# CONFIG_SYSV_FS is not set # CONFIG_SYSV_FS is not set
# CONFIG_UDF_FS is not set # CONFIG_UDF_FS is not set
# CONFIG_UDF_RW is not set
# CONFIG_UFS_FS is not set # CONFIG_UFS_FS is not set
# CONFIG_UFS_FS_WRITE is not set # CONFIG_XFS_FS is not set
# #
# Network File Systems # Network File Systems
...@@ -568,107 +488,52 @@ CONFIG_EXT2_FS=y ...@@ -568,107 +488,52 @@ CONFIG_EXT2_FS=y
# CONFIG_INTERMEZZO_FS is not set # CONFIG_INTERMEZZO_FS is not set
CONFIG_NFS_FS=y CONFIG_NFS_FS=y
# CONFIG_NFS_V3 is not set # CONFIG_NFS_V3 is not set
# CONFIG_NFS_V4 is not set
# CONFIG_ROOT_NFS is not set # CONFIG_ROOT_NFS is not set
# CONFIG_NFSD is not set # CONFIG_NFSD is not set
# CONFIG_NFSD_V3 is not set
CONFIG_SUNRPC=y CONFIG_SUNRPC=y
# CONFIG_SUNRPC_GSS is not set
CONFIG_LOCKD=y CONFIG_LOCKD=y
# CONFIG_EXPORTFS is not set
# CONFIG_CIFS is not set
# CONFIG_SMB_FS is not set # CONFIG_SMB_FS is not set
# CONFIG_NCP_FS is not set # CONFIG_NCP_FS is not set
# CONFIG_NCPFS_PACKET_SIGNING is not set # CONFIG_AFS_FS is not set
# CONFIG_NCPFS_IOCTL_LOCKING is not set
# CONFIG_NCPFS_STRONG is not set
# CONFIG_NCPFS_NFS_NS is not set
# CONFIG_NCPFS_OS2_NS is not set
# CONFIG_NCPFS_SMALLDOS is not set
# CONFIG_NCPFS_NLS is not set
# CONFIG_NCPFS_EXTRAS is not set
# CONFIG_ZISOFS_FS is not set
# CONFIG_ZLIB_FS_INFLATE is not set
# #
# Partition Types # Partition Types
# #
# CONFIG_PARTITION_ADVANCED is not set # CONFIG_PARTITION_ADVANCED is not set
CONFIG_MSDOS_PARTITION=y
# CONFIG_SMB_NLS is not set #
# CONFIG_NLS is not set # Graphics support
#
# CONFIG_FB is not set
#
# Console display driver support
#
# CONFIG_VGA_CONSOLE is not set
# CONFIG_MDA_CONSOLE is not set
CONFIG_DUMMY_CONSOLE=y
#
# Misc devices
#
# #
# Multimedia Capabilities Port drivers # Multimedia Capabilities Port drivers
# #
# CONFIG_MCP is not set # CONFIG_MCP is not set
# CONFIG_MCP_SA1100 is not set
# CONFIG_MCP_UCB1200 is not set #
# CONFIG_MCP_UCB1200_AUDIO is not set # Console Switches
# CONFIG_MCP_UCB1200_TS is not set #
# CONFIG_SWITCHES is not set
# #
# USB support # USB support
# #
# CONFIG_USB is not set
# CONFIG_USB_EHCI_HCD is not set
# CONFIG_USB_UHCI is not set
# CONFIG_USB_UHCI_ALT is not set
# CONFIG_USB_OHCI is not set
# CONFIG_USB_OHCI_SA1111 is not set
# CONFIG_USB_AUDIO is not set
# CONFIG_USB_BLUETOOTH is not set
# CONFIG_USB_STORAGE is not set
# CONFIG_USB_STORAGE_DEBUG is not set
# CONFIG_USB_STORAGE_DATAFAB is not set
# CONFIG_USB_STORAGE_FREECOM is not set
# CONFIG_USB_STORAGE_ISD200 is not set
# CONFIG_USB_STORAGE_DPCM is not set
# CONFIG_USB_STORAGE_HP8200e is not set
# CONFIG_USB_STORAGE_SDDR09 is not set
# CONFIG_USB_STORAGE_JUMPSHOT is not set
# CONFIG_USB_ACM is not set
# CONFIG_USB_PRINTER is not set
# CONFIG_USB_DC2XX is not set
# CONFIG_USB_MDC800 is not set
# CONFIG_USB_SCANNER is not set
# CONFIG_USB_MICROTEK is not set
# CONFIG_USB_HPUSBSCSI is not set
# CONFIG_USB_PEGASUS is not set
# CONFIG_USB_KAWETH is not set
# CONFIG_USB_CATC is not set
# CONFIG_USB_CDCETHER is not set
# CONFIG_USB_USBNET is not set
# CONFIG_USB_USS720 is not set
#
# USB Serial Converter support
#
# CONFIG_USB_SERIAL is not set
# CONFIG_USB_SERIAL_GENERIC is not set
# CONFIG_USB_SERIAL_BELKIN is not set
# CONFIG_USB_SERIAL_WHITEHEAT is not set
# CONFIG_USB_SERIAL_DIGI_ACCELEPORT is not set
# CONFIG_USB_SERIAL_EMPEG is not set
# CONFIG_USB_SERIAL_FTDI_SIO is not set
# CONFIG_USB_SERIAL_VISOR is not set
# CONFIG_USB_SERIAL_IPAQ is not set
# CONFIG_USB_SERIAL_IR is not set
# CONFIG_USB_SERIAL_EDGEPORT is not set
# CONFIG_USB_SERIAL_KEYSPAN_PDA is not set
# CONFIG_USB_SERIAL_KEYSPAN is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA28 is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA28X is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA28XA is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA28XB is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA19 is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA18X is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA19W is not set
# CONFIG_USB_SERIAL_KEYSPAN_USA49W is not set
# CONFIG_USB_SERIAL_MCT_U232 is not set
# CONFIG_USB_SERIAL_KLSI is not set
# CONFIG_USB_SERIAL_PL2303 is not set
# CONFIG_USB_SERIAL_CYBERJACK is not set
# CONFIG_USB_SERIAL_XIRCOM is not set
# CONFIG_USB_SERIAL_OMNINET is not set
# CONFIG_USB_RIO500 is not set
# CONFIG_USB_AUERSWALD is not set
# #
# Bluetooth support # Bluetooth support
...@@ -681,19 +546,21 @@ CONFIG_MSDOS_PARTITION=y ...@@ -681,19 +546,21 @@ CONFIG_MSDOS_PARTITION=y
CONFIG_FRAME_POINTER=y CONFIG_FRAME_POINTER=y
# CONFIG_DEBUG_USER is not set # CONFIG_DEBUG_USER is not set
# CONFIG_DEBUG_INFO is not set # CONFIG_DEBUG_INFO is not set
# CONFIG_NO_PGT_CACHE is not set
# CONFIG_DEBUG_KERNEL is not set # CONFIG_DEBUG_KERNEL is not set
# CONFIG_DEBUG_SLAB is not set
# CONFIG_MAGIC_SYSRQ is not set #
# CONFIG_DEBUG_SPINLOCK is not set # Security options
# CONFIG_DEBUG_WAITQ is not set #
# CONFIG_DEBUG_BUGVERBOSE is not set # CONFIG_SECURITY is not set
# CONFIG_DEBUG_ERRORS is not set
# CONFIG_DEBUG_LL is not set #
# CONFIG_DEBUG_DC21285_PORT is not set # Cryptographic options
# CONFIG_DEBUG_CLPS711X_UART2 is not set #
# CONFIG_CRYPTO is not set
# #
# Library routines # Library routines
# #
# CONFIG_CRC32 is not set # CONFIG_CRC32 is not set
CONFIG_ZLIB_INFLATE=y
CONFIG_ZLIB_DEFLATE=y
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
static struct fs_struct init_fs = INIT_FS; static struct fs_struct init_fs = INIT_FS;
static struct files_struct init_files = INIT_FILES; static struct files_struct init_files = INIT_FILES;
static struct signal_struct init_signals = INIT_SIGNALS(init_signals); static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
struct mm_struct init_mm = INIT_MM(init_mm); struct mm_struct init_mm = INIT_MM(init_mm);
/* /*
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/list.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/system.h> #include <asm/system.h>
...@@ -45,6 +46,7 @@ ...@@ -45,6 +46,7 @@
static volatile unsigned long irq_err_count; static volatile unsigned long irq_err_count;
static spinlock_t irq_controller_lock; static spinlock_t irq_controller_lock;
static LIST_HEAD(irq_pending);
struct irqdesc irq_desc[NR_IRQS]; struct irqdesc irq_desc[NR_IRQS];
void (*init_arch_irq)(void) __initdata = NULL; void (*init_arch_irq)(void) __initdata = NULL;
...@@ -69,9 +71,10 @@ static struct irqchip bad_chip = { ...@@ -69,9 +71,10 @@ static struct irqchip bad_chip = {
}; };
static struct irqdesc bad_irq_desc = { static struct irqdesc bad_irq_desc = {
.chip = &bad_chip, .chip = &bad_chip,
.handle = do_bad_IRQ, .handle = do_bad_IRQ,
.depth = 1, .pend = LIST_HEAD_INIT(bad_irq_desc.pend),
.disable_depth = 1,
}; };
/** /**
...@@ -90,6 +93,7 @@ void disable_irq(unsigned int irq) ...@@ -90,6 +93,7 @@ void disable_irq(unsigned int irq)
spin_lock_irqsave(&irq_controller_lock, flags); spin_lock_irqsave(&irq_controller_lock, flags);
desc->disable_depth++; desc->disable_depth++;
list_del_init(&desc->pend);
spin_unlock_irqrestore(&irq_controller_lock, flags); spin_unlock_irqrestore(&irq_controller_lock, flags);
} }
...@@ -122,9 +126,11 @@ void enable_irq(unsigned int irq) ...@@ -122,9 +126,11 @@ void enable_irq(unsigned int irq)
* from here since the caller might be in an * from here since the caller might be in an
* interrupt-protected region. * interrupt-protected region.
*/ */
if (desc->pending) { if (desc->pending && list_empty(&desc->pend)) {
desc->pending = 0; desc->pending = 0;
desc->chip->rerun(irq); if (!desc->chip->retrigger ||
desc->chip->retrigger(irq))
list_add(&desc->pend, &irq_pending);
} }
} }
spin_unlock_irqrestore(&irq_controller_lock, flags); spin_unlock_irqrestore(&irq_controller_lock, flags);
...@@ -346,6 +352,40 @@ do_level_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs) ...@@ -346,6 +352,40 @@ do_level_IRQ(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs)
} }
} }
static void do_pending_irqs(struct pt_regs *regs)
{
struct list_head head, *l, *n;
do {
struct irqdesc *desc;
/*
* First, take the pending interrupts off the list.
* The act of calling the handlers may add some IRQs
* back onto the list.
*/
head = irq_pending;
INIT_LIST_HEAD(&irq_pending);
head.next->prev = &head;
head.prev->next = &head;
/*
* Now run each entry. We must delete it from our
* list before calling the handler.
*/
list_for_each_safe(l, n, &head) {
desc = list_entry(l, struct irqdesc, pend);
list_del_init(&desc->pend);
desc->handle(desc - irq_desc, desc, regs);
}
/*
* The list must be empty.
*/
BUG_ON(!list_empty(&head));
} while (!list_empty(&irq_pending));
}
/* /*
* do_IRQ handles all hardware IRQ's. Decoded IRQs should not * do_IRQ handles all hardware IRQ's. Decoded IRQs should not
* come via this function. Instead, they should provide their * come via this function. Instead, they should provide their
...@@ -365,6 +405,13 @@ asmlinkage void asm_do_IRQ(int irq, struct pt_regs *regs) ...@@ -365,6 +405,13 @@ asmlinkage void asm_do_IRQ(int irq, struct pt_regs *regs)
irq_enter(); irq_enter();
spin_lock(&irq_controller_lock); spin_lock(&irq_controller_lock);
desc->handle(irq, desc, regs); desc->handle(irq, desc, regs);
/*
* Now re-run any pending interrupts.
*/
if (!list_empty(&irq_pending))
do_pending_irqs(regs);
spin_unlock(&irq_controller_lock); spin_unlock(&irq_controller_lock);
irq_exit(); irq_exit();
} }
...@@ -740,8 +787,10 @@ void __init init_IRQ(void) ...@@ -740,8 +787,10 @@ void __init init_IRQ(void)
extern void init_dma(void); extern void init_dma(void);
int irq; int irq;
for (irq = 0, desc = irq_desc; irq < NR_IRQS; irq++, desc++) for (irq = 0, desc = irq_desc; irq < NR_IRQS; irq++, desc++) {
*desc = bad_irq_desc; *desc = bad_irq_desc;
INIT_LIST_HEAD(&desc->pend);
}
init_arch_irq(); init_arch_irq();
init_dma(); init_dma();
......
...@@ -446,7 +446,7 @@ void ptrace_set_bpt(struct task_struct *child) ...@@ -446,7 +446,7 @@ void ptrace_set_bpt(struct task_struct *child)
* Ensure no single-step breakpoint is pending. Returns non-zero * Ensure no single-step breakpoint is pending. Returns non-zero
* value if child was being single-stepped. * value if child was being single-stepped.
*/ */
void __ptrace_cancel_bpt(struct task_struct *child) void ptrace_cancel_bpt(struct task_struct *child)
{ {
int i, nsaved = child->thread.debug.nsaved; int i, nsaved = child->thread.debug.nsaved;
...@@ -468,7 +468,8 @@ void __ptrace_cancel_bpt(struct task_struct *child) ...@@ -468,7 +468,8 @@ void __ptrace_cancel_bpt(struct task_struct *child)
*/ */
void ptrace_disable(struct task_struct *child) void ptrace_disable(struct task_struct *child)
{ {
__ptrace_cancel_bpt(child); child->ptrace &= ~PT_SINGLESTEP;
ptrace_cancel_bpt(child);
} }
/* /*
...@@ -486,7 +487,7 @@ void ptrace_break(struct task_struct *tsk, struct pt_regs *regs) ...@@ -486,7 +487,7 @@ void ptrace_break(struct task_struct *tsk, struct pt_regs *regs)
if (tsk->thread.debug.nsaved == 0) if (tsk->thread.debug.nsaved == 0)
printk(KERN_ERR "ptrace: bogus breakpoint trap\n"); printk(KERN_ERR "ptrace: bogus breakpoint trap\n");
__ptrace_cancel_bpt(tsk); ptrace_cancel_bpt(tsk);
info.si_signo = SIGTRAP; info.si_signo = SIGTRAP;
info.si_errno = 0; info.si_errno = 0;
...@@ -637,7 +638,8 @@ static int do_ptrace(int request, struct task_struct *child, long addr, long dat ...@@ -637,7 +638,8 @@ static int do_ptrace(int request, struct task_struct *child, long addr, long dat
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
child->exit_code = data; child->exit_code = data;
/* make sure single-step breakpoint is gone. */ /* make sure single-step breakpoint is gone. */
__ptrace_cancel_bpt(child); child->ptrace &= ~PT_SINGLESTEP;
ptrace_cancel_bpt(child);
wake_up_process(child); wake_up_process(child);
ret = 0; ret = 0;
break; break;
...@@ -649,7 +651,8 @@ static int do_ptrace(int request, struct task_struct *child, long addr, long dat ...@@ -649,7 +651,8 @@ static int do_ptrace(int request, struct task_struct *child, long addr, long dat
*/ */
case PTRACE_KILL: case PTRACE_KILL:
/* make sure single-step breakpoint is gone. */ /* make sure single-step breakpoint is gone. */
__ptrace_cancel_bpt(child); child->ptrace &= ~PT_SINGLESTEP;
ptrace_cancel_bpt(child);
if (child->state != TASK_ZOMBIE) { if (child->state != TASK_ZOMBIE) {
child->exit_code = SIGKILL; child->exit_code = SIGKILL;
wake_up_process(child); wake_up_process(child);
...@@ -664,7 +667,7 @@ static int do_ptrace(int request, struct task_struct *child, long addr, long dat ...@@ -664,7 +667,7 @@ static int do_ptrace(int request, struct task_struct *child, long addr, long dat
ret = -EIO; ret = -EIO;
if ((unsigned long) data > _NSIG) if ((unsigned long) data > _NSIG)
break; break;
child->thread.debug.nsaved = -1; child->ptrace |= PT_SINGLESTEP;
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
child->exit_code = data; child->exit_code = data;
/* give it a chance to run. */ /* give it a chance to run. */
......
/* /*
* linux/arch/arm/kernel/ptrace.h * linux/arch/arm/kernel/ptrace.h
* *
* Copyright (C) 2000-2002 Russell King * Copyright (C) 2000-2003 Russell King
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as * it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
extern void __ptrace_cancel_bpt(struct task_struct *); extern void ptrace_cancel_bpt(struct task_struct *);
extern void ptrace_set_bpt(struct task_struct *); extern void ptrace_set_bpt(struct task_struct *);
extern void ptrace_break(struct task_struct *, struct pt_regs *); extern void ptrace_break(struct task_struct *, struct pt_regs *);
/*
* Clear a breakpoint, if one exists.
*/
static inline int ptrace_cancel_bpt(struct task_struct *tsk)
{
int nsaved = tsk->thread.debug.nsaved;
if (nsaved)
__ptrace_cancel_bpt(tsk);
return nsaved;
}
...@@ -216,8 +216,10 @@ asmlinkage int sys_sigreturn(struct pt_regs *regs) ...@@ -216,8 +216,10 @@ asmlinkage int sys_sigreturn(struct pt_regs *regs)
goto badframe; goto badframe;
/* Send SIGTRAP if we're single-stepping */ /* Send SIGTRAP if we're single-stepping */
if (ptrace_cancel_bpt(current)) if (current->ptrace & PT_SINGLESTEP) {
ptrace_cancel_bpt(current);
send_sig(SIGTRAP, current, 1); send_sig(SIGTRAP, current, 1);
}
return regs->ARM_r0; return regs->ARM_r0;
...@@ -256,8 +258,10 @@ asmlinkage int sys_rt_sigreturn(struct pt_regs *regs) ...@@ -256,8 +258,10 @@ asmlinkage int sys_rt_sigreturn(struct pt_regs *regs)
goto badframe; goto badframe;
/* Send SIGTRAP if we're single-stepping */ /* Send SIGTRAP if we're single-stepping */
if (ptrace_cancel_bpt(current)) if (current->ptrace & PT_SINGLESTEP) {
ptrace_cancel_bpt(current);
send_sig(SIGTRAP, current, 1); send_sig(SIGTRAP, current, 1);
}
return regs->ARM_r0; return regs->ARM_r0;
...@@ -441,18 +445,47 @@ setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info, ...@@ -441,18 +445,47 @@ setup_rt_frame(int usig, struct k_sigaction *ka, siginfo_t *info,
return err; return err;
} }
static inline void restart_syscall(struct pt_regs *regs)
{
regs->ARM_r0 = regs->ARM_ORIG_r0;
regs->ARM_pc -= thumb_mode(regs) ? 2 : 4;
}
/* /*
* OK, we're invoking a handler * OK, we're invoking a handler
*/ */
static void static void
handle_signal(unsigned long sig, struct k_sigaction *ka, handle_signal(unsigned long sig, siginfo_t *info, sigset_t *oldset,
siginfo_t *info, sigset_t *oldset, struct pt_regs * regs) struct pt_regs * regs, int syscall)
{ {
struct thread_info *thread = current_thread_info(); struct thread_info *thread = current_thread_info();
struct task_struct *tsk = current; struct task_struct *tsk = current;
struct k_sigaction *ka = &tsk->sighand->action[sig-1];
int usig = sig; int usig = sig;
int ret; int ret;
/*
* If we were from a system call, check for system call restarting...
*/
if (syscall) {
switch (regs->ARM_r0) {
case -ERESTART_RESTARTBLOCK:
current_thread_info()->restart_block.fn =
do_no_restart_syscall;
case -ERESTARTNOHAND:
regs->ARM_r0 = -EINTR;
break;
case -ERESTARTSYS:
if (!(ka->sa.sa_flags & SA_RESTART)) {
regs->ARM_r0 = -EINTR;
break;
}
/* fallthrough */
case -ERESTARTNOINTR:
restart_syscall(regs);
}
}
/* /*
* translate the signal * translate the signal
*/ */
...@@ -504,7 +537,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, ...@@ -504,7 +537,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka,
static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall) static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall)
{ {
siginfo_t info; siginfo_t info;
int single_stepping; int signr;
/* /*
* We want the common case to go fast, which * We want the common case to go fast, which
...@@ -515,130 +548,14 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall) ...@@ -515,130 +548,14 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall)
if (!user_mode(regs)) if (!user_mode(regs))
return 0; return 0;
single_stepping = ptrace_cancel_bpt(current); if (current->ptrace & PT_SINGLESTEP)
ptrace_cancel_bpt(current);
for (;;) {
unsigned long signr = 0;
struct k_sigaction *ka;
spin_lock_irq(&current->sighand->siglock);
signr = dequeue_signal(current, &current->blocked, &info);
spin_unlock_irq(&current->sighand->siglock);
if (!signr)
break;
if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) { signr = get_signal_to_deliver(&info, regs, NULL);
/* Let the debugger run. */ if (signr > 0) {
current->exit_code = signr; handle_signal(signr, &info, oldset, regs, syscall);
set_current_state(TASK_STOPPED); if (current->ptrace & PT_SINGLESTEP)
notify_parent(current, SIGCHLD); ptrace_set_bpt(current);
schedule();
single_stepping |= ptrace_cancel_bpt(current);
/* We're back. Did the debugger cancel the sig? */
signr = current->exit_code;
if (signr == 0)
continue;
current->exit_code = 0;
/* The debugger continued. Ignore SIGSTOP. */
if (signr == SIGSTOP)
continue;
/* Update the siginfo structure. Is this good? */
if (signr != info.si_signo) {
info.si_signo = signr;
info.si_errno = 0;
info.si_code = SI_USER;
info.si_pid = current->parent->pid;
info.si_uid = current->parent->uid;
}
/* If the (new) signal is now blocked, requeue it. */
if (sigismember(&current->blocked, signr)) {
send_sig_info(signr, &info, current);
continue;
}
}
ka = &current->sig->action[signr-1];
if (ka->sa.sa_handler == SIG_IGN) {
if (signr != SIGCHLD)
continue;
/* Check for SIGCHLD: it's special. */
while (sys_wait4(-1, NULL, WNOHANG, NULL) > 0)
/* nothing */;
continue;
}
if (ka->sa.sa_handler == SIG_DFL) {
int exit_code = signr;
/* Init gets no signals it doesn't want. */
if (current->pid == 1)
continue;
switch (signr) {
case SIGCONT: case SIGCHLD: case SIGWINCH: case SIGURG:
continue;
case SIGTSTP: case SIGTTIN: case SIGTTOU:
if (is_orphaned_pgrp(current->pgrp))
continue;
/* FALLTHRU */
case SIGSTOP: {
struct signal_struct *sig;
set_current_state(TASK_STOPPED);
current->exit_code = signr;
sig = current->parent->sig;
if (sig && !(sig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDSTOP))
notify_parent(current, SIGCHLD);
schedule();
single_stepping |= ptrace_cancel_bpt(current);
continue;
}
case SIGQUIT: case SIGILL: case SIGTRAP:
case SIGABRT: case SIGFPE: case SIGSEGV:
case SIGBUS: case SIGSYS: case SIGXCPU: case SIGXFSZ:
if (do_coredump(signr, exit_code, regs))
exit_code |= 0x80;
/* FALLTHRU */
default:
sig_exit(signr, exit_code, &info);
/* NOTREACHED */
}
}
/* Are we from a system call? */
if (syscall) {
/* If so, check system call restarting.. */
switch (regs->ARM_r0) {
case -ERESTART_RESTARTBLOCK:
current_thread_info()->restart_block.fn =
do_no_restart_syscall;
case -ERESTARTNOHAND:
regs->ARM_r0 = -EINTR;
break;
case -ERESTARTSYS:
if (!(ka->sa.sa_flags & SA_RESTART)) {
regs->ARM_r0 = -EINTR;
break;
}
/* fallthrough */
case -ERESTARTNOINTR:
regs->ARM_r0 = regs->ARM_ORIG_r0;
regs->ARM_pc -= 4;
}
}
/* Whee! Actually deliver the signal. */
handle_signal(signr, ka, &info, oldset, regs);
if (single_stepping)
ptrace_set_bpt(current);
return 1; return 1;
} }
...@@ -668,11 +585,10 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall) ...@@ -668,11 +585,10 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall)
if (regs->ARM_r0 == -ERESTARTNOHAND || if (regs->ARM_r0 == -ERESTARTNOHAND ||
regs->ARM_r0 == -ERESTARTSYS || regs->ARM_r0 == -ERESTARTSYS ||
regs->ARM_r0 == -ERESTARTNOINTR) { regs->ARM_r0 == -ERESTARTNOINTR) {
regs->ARM_r0 = regs->ARM_ORIG_r0; restart_syscall(regs);
regs->ARM_pc -= 4;
} }
} }
if (single_stepping) if (current->ptrace & PT_SINGLESTEP)
ptrace_set_bpt(current); ptrace_set_bpt(current);
return 0; return 0;
} }
......
...@@ -52,9 +52,14 @@ static const char *handler[]= { "prefetch abort", "data abort", "address excepti ...@@ -52,9 +52,14 @@ static const char *handler[]= { "prefetch abort", "data abort", "address excepti
void dump_backtrace_entry(unsigned long where, unsigned long from) void dump_backtrace_entry(unsigned long where, unsigned long from)
{ {
#ifdef CONFIG_KALLSYMS
printk("[<%08lx>] ", where);
print_symbol("(%s) ", where);
printk("from [<%08lx>] ", from);
print_symbol("(%s)\n", from);
#else
printk("Function entered at [<%08lx>] from [<%08lx>]\n", where, from); printk("Function entered at [<%08lx>] from [<%08lx>]\n", where, from);
print_symbol(" %s", where); #endif
printk("\n");
} }
/* /*
...@@ -503,11 +508,11 @@ baddataabort(int code, unsigned long instr, struct pt_regs *regs) ...@@ -503,11 +508,11 @@ baddataabort(int code, unsigned long instr, struct pt_regs *regs)
die_if_kernel("unknown data abort code", regs, instr); die_if_kernel("unknown data abort code", regs, instr);
} }
void __bug(const char *file, int line, void *data) volatile void __bug(const char *file, int line, void *data)
{ {
printk(KERN_CRIT"kernel BUG at %s:%d!", file, line); printk(KERN_CRIT"kernel BUG at %s:%d!", file, line);
if (data) if (data)
printk(KERN_CRIT" - extra data = %p", data); printk(" - extra data = %p", data);
printk("\n"); printk("\n");
*(int *)0 = 0; *(int *)0 = 0;
} }
......
...@@ -82,11 +82,20 @@ ENTRY(c_backtrace) ...@@ -82,11 +82,20 @@ ENTRY(c_backtrace)
teq r3, r2 teq r3, r2
bleq .Ldumpstm bleq .Ldumpstm
teq frame, next /*
movne frame, next * A zero next framepointer means we're done.
teqne frame, #0 */
bne 3b teq next, #0
LOADREGS(fd, sp!, {r4 - r8, pc}) LOADREGS(eqfd, sp!, {r4 - r8, pc})
/*
* The next framepointer must be above the
* current framepointer.
*/
cmp next, frame
mov frame, next
bhi 3b
b 1007f
/* /*
* Fixup for LDMDB * Fixup for LDMDB
......
...@@ -19,6 +19,9 @@ ...@@ -19,6 +19,9 @@
*/ */
#include <linux/init.h> #include <linux/init.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/stddef.h>
#include <linux/timer.h>
#include <linux/list.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/hardware.h> #include <asm/hardware.h>
#include <asm/irq.h> #include <asm/irq.h>
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
* 16-Mar-1999 RMK Added autodetect of ISA PICs * 16-Mar-1999 RMK Added autodetect of ISA PICs
*/ */
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/list.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/mach/irq.h> #include <asm/mach/irq.h>
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
*/ */
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/list.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/mach/irq.h> #include <asm/mach/irq.h>
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
*/ */
#include <linux/init.h> #include <linux/init.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/list.h>
#include <asm/mach/irq.h> #include <asm/mach/irq.h>
#include <asm/irq.h> #include <asm/irq.h>
......
...@@ -360,6 +360,8 @@ int iop310_setup(int nr, struct pci_sys_data *sys) ...@@ -360,6 +360,8 @@ int iop310_setup(int nr, struct pci_sys_data *sys)
if (!res) if (!res)
panic("PCI: unable to alloc resources"); panic("PCI: unable to alloc resources");
memset(res, 0, sizeof(struct resource) * 2);
switch (nr) { switch (nr) {
case 0: case 0:
res[0].start = IOP310_PCIPRI_LOWER_IO + 0x6e000000; res[0].start = IOP310_PCIPRI_LOWER_IO + 0x6e000000;
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
* Fixes for various revision boards - DS * Fixes for various revision boards - DS
*/ */
#include <linux/init.h> #include <linux/init.h>
#include <linux/list.h>
#include <asm/irq.h> #include <asm/irq.h>
#include <asm/mach/irq.h> #include <asm/mach/irq.h>
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
* published by the Free Software Foundation. * published by the Free Software Foundation.
*/ */
#include <linux/init.h> #include <linux/init.h>
#include <linux/list.h>
#include <asm/mach/irq.h> #include <asm/mach/irq.h>
#include <asm/irq.h> #include <asm/irq.h>
......
...@@ -85,19 +85,6 @@ static int pxa_gpio_irq_type(unsigned int irq, unsigned int type) ...@@ -85,19 +85,6 @@ static int pxa_gpio_irq_type(unsigned int irq, unsigned int type)
return 0; return 0;
} }
/*
* Since we can't actually physically mask edge triggered interrupts
* without the risk of missing transitions, we therefore logically mask
* them and defer their processing through tis function.
*/
static void pxa_manual_rerun(unsigned int irq)
{
struct pt_regs regs;
memset(&regs, 0, sizeof(regs));
irq_desc[irq].handle(irq, &irq_desc[irq], &regs);
}
/* /*
* GPIO IRQs must be acknoledged. This is for GPIO 0 and 1. * GPIO IRQs must be acknoledged. This is for GPIO 0 and 1.
*/ */
...@@ -111,7 +98,6 @@ static struct irqchip pxa_low_gpio_chip = { ...@@ -111,7 +98,6 @@ static struct irqchip pxa_low_gpio_chip = {
.ack = pxa_ack_low_gpio, .ack = pxa_ack_low_gpio,
.mask = pxa_mask_irq, .mask = pxa_mask_irq,
.unmask = pxa_unmask_irq, .unmask = pxa_unmask_irq,
.rerun = pxa_manual_rerun,
.type = pxa_gpio_irq_type, .type = pxa_gpio_irq_type,
}; };
......
#include <linux/init.h> #include <linux/init.h>
#include <linux/list.h>
#include <asm/mach/irq.h> #include <asm/mach/irq.h>
#include <asm/hardware/iomd.h> #include <asm/hardware/iomd.h>
......
...@@ -13,6 +13,7 @@ ...@@ -13,6 +13,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/ptrace.h> #include <linux/ptrace.h>
#include <linux/device.h>
#include <asm/hardware.h> #include <asm/hardware.h>
#include <asm/irq.h> #include <asm/irq.h>
...@@ -24,20 +25,12 @@ ...@@ -24,20 +25,12 @@
/* /*
* SA1100 GPIO edge detection for IRQs: * SA1100 GPIO edge detection for IRQs:
* IRQs are generated on Falling-Edge, Rising-Edge, or both. * IRQs are generated on Falling-Edge, Rising-Edge, or both.
* This must be called *before* the appropriate IRQ is registered.
* Use this instead of directly setting GRER/GFER. * Use this instead of directly setting GRER/GFER.
*/ */
static int GPIO_IRQ_rising_edge; static int GPIO_IRQ_rising_edge;
static int GPIO_IRQ_falling_edge; static int GPIO_IRQ_falling_edge;
static int GPIO_IRQ_mask = (1 << 11) - 1; static int GPIO_IRQ_mask = (1 << 11) - 1;
static void sa1100_manual_rerun(unsigned int irq)
{
struct pt_regs regs;
memset(&regs, 0, sizeof(regs));
irq_desc[irq].handle(irq, &irq_desc[irq], &regs);
}
/* /*
* To get the GPIO number from an IRQ number * To get the GPIO number from an IRQ number
*/ */
...@@ -105,7 +98,6 @@ static struct irqchip sa1100_low_gpio_chip = { ...@@ -105,7 +98,6 @@ static struct irqchip sa1100_low_gpio_chip = {
.ack = sa1100_low_gpio_ack, .ack = sa1100_low_gpio_ack,
.mask = sa1100_low_gpio_mask, .mask = sa1100_low_gpio_mask,
.unmask = sa1100_low_gpio_unmask, .unmask = sa1100_low_gpio_unmask,
.rerun = sa1100_manual_rerun,
.type = sa1100_gpio_type, .type = sa1100_gpio_type,
.wake = sa1100_low_gpio_wake, .wake = sa1100_low_gpio_wake,
}; };
...@@ -189,7 +181,6 @@ static struct irqchip sa1100_high_gpio_chip = { ...@@ -189,7 +181,6 @@ static struct irqchip sa1100_high_gpio_chip = {
.ack = sa1100_high_gpio_ack, .ack = sa1100_high_gpio_ack,
.mask = sa1100_high_gpio_mask, .mask = sa1100_high_gpio_mask,
.unmask = sa1100_high_gpio_unmask, .unmask = sa1100_high_gpio_unmask,
.rerun = sa1100_manual_rerun,
.type = sa1100_gpio_type, .type = sa1100_gpio_type,
.wake = sa1100_high_gpio_wake, .wake = sa1100_high_gpio_wake,
}; };
...@@ -212,7 +203,6 @@ static struct irqchip sa1100_normal_chip = { ...@@ -212,7 +203,6 @@ static struct irqchip sa1100_normal_chip = {
.ack = sa1100_mask_irq, .ack = sa1100_mask_irq,
.mask = sa1100_mask_irq, .mask = sa1100_mask_irq,
.unmask = sa1100_unmask_irq, .unmask = sa1100_unmask_irq,
/* rerun should never be called */
}; };
static struct resource irq_resource = { static struct resource irq_resource = {
...@@ -267,10 +257,4 @@ void __init sa1100_init_irq(void) ...@@ -267,10 +257,4 @@ void __init sa1100_init_irq(void)
*/ */
set_irq_chip(IRQ_GPIO11_27, &sa1100_normal_chip); set_irq_chip(IRQ_GPIO11_27, &sa1100_normal_chip);
set_irq_chained_handler(IRQ_GPIO11_27, sa1100_high_gpio_handler); set_irq_chained_handler(IRQ_GPIO11_27, sa1100_high_gpio_handler);
/*
* We generally don't want the LCD IRQ being
* enabled as soon as we request it.
*/
set_irq_flags(IRQ_LCD, IRQF_VALID/* | IRQF_NOAUTOEN*/);
} }
...@@ -15,9 +15,9 @@ ...@@ -15,9 +15,9 @@
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <asm/mach/map.h> #include <asm/mach/map.h>
#include <asm/mach/serial_sa1100.h> #include <asm/mach/serial_sa1100.h>
#include <asm/hardware/sa1111.h>
#include "generic.h" #include "generic.h"
#include "sa1111.h"
static void xp860_power_off(void) static void xp860_power_off(void)
......
...@@ -83,7 +83,7 @@ static void vm_region_dump(struct vm_region *head, char *fn) ...@@ -83,7 +83,7 @@ static void vm_region_dump(struct vm_region *head, char *fn)
struct vm_region *c; struct vm_region *c;
printk("Consistent Allocation Map (%s):\n", fn); printk("Consistent Allocation Map (%s):\n", fn);
list_for_each_entry(c, &head->list, vm_list) { list_for_each_entry(c, &head->vm_list, vm_list) {
printk(" %p: %08lx - %08lx (0x%08x)\n", c, printk(" %p: %08lx - %08lx (0x%08x)\n", c,
c->vm_start, c->vm_end, c->vm_end - c->vm_start); c->vm_start, c->vm_end, c->vm_end - c->vm_start);
} }
......
...@@ -678,7 +678,7 @@ __xscale_setup: ...@@ -678,7 +678,7 @@ __xscale_setup:
mcr p15, 0, r0, c15, c1, 0 @ affects USR or SVC modes mcr p15, 0, r0, c15, c1, 0 @ affects USR or SVC modes
mrc p15, 0, r0, c1, c0, 0 @ get control register mrc p15, 0, r0, c1, c0, 0 @ get control register
bic r0, r0, #0x0200 @ .... ..R. .... .... bic r0, r0, #0x0200 @ .... ..R. .... ....
bic r0, r0, #0x0082 @ .... .... B... ..A. bic r0, r0, #0x0002 @ .... .... .... ..A.
orr r0, r0, #0x0005 @ .... .... .... .C.M orr r0, r0, #0x0005 @ .... .... .... .C.M
orr r0, r0, #0x3900 @ ..VI Z..S .... .... orr r0, r0, #0x3900 @ ..VI Z..S .... ....
mov pc, lr mov pc, lr
......
...@@ -7,7 +7,11 @@ ...@@ -7,7 +7,11 @@
OUTPUT_ARCH(arm) OUTPUT_ARCH(arm)
ENTRY(stext) ENTRY(stext)
#ifndef __ARMEB__
jiffies = jiffies_64; jiffies = jiffies_64;
#else
jiffies = jiffies_64 + 4;
#endif
SECTIONS SECTIONS
{ {
. = TEXTADDR; . = TEXTADDR;
......
...@@ -116,7 +116,7 @@ ...@@ -116,7 +116,7 @@
#ifdef DEBUG_TARGET #ifdef DEBUG_TARGET
#define DBG(cmd,xxx...) \ #define DBG(cmd,xxx...) \
if (cmd->target == DEBUG_TARGET) { \ if (cmd->device->id == DEBUG_TARGET) { \
xxx; \ xxx; \
} }
#else #else
...@@ -575,7 +575,7 @@ static ...@@ -575,7 +575,7 @@ static
char acornscsi_target(AS_Host *host) char acornscsi_target(AS_Host *host)
{ {
if (host->SCpnt) if (host->SCpnt)
return '0' + host->SCpnt->target; return '0' + host->SCpnt->device->id;
return 'H'; return 'H';
} }
...@@ -742,7 +742,7 @@ intr_ret_t acornscsi_kick(AS_Host *host) ...@@ -742,7 +742,7 @@ intr_ret_t acornscsi_kick(AS_Host *host)
* In this case, we don't want to write to the registers * In this case, we don't want to write to the registers
*/ */
if (!(sbic_arm_read(host->scsi.io_port, ASR) & (ASR_INT|ASR_BSY|ASR_CIP))) { if (!(sbic_arm_read(host->scsi.io_port, ASR) & (ASR_INT|ASR_BSY|ASR_CIP))) {
sbic_arm_write(host->scsi.io_port, DESTID, SCpnt->target); sbic_arm_write(host->scsi.io_port, DESTID, SCpnt->device->id);
sbic_arm_write(host->scsi.io_port, CMND, CMND_SELWITHATN); sbic_arm_write(host->scsi.io_port, CMND, CMND_SELWITHATN);
} }
...@@ -759,7 +759,7 @@ intr_ret_t acornscsi_kick(AS_Host *host) ...@@ -759,7 +759,7 @@ intr_ret_t acornscsi_kick(AS_Host *host)
#if (DEBUG & (DEBUG_ABORT|DEBUG_CONNECT)) #if (DEBUG & (DEBUG_ABORT|DEBUG_CONNECT))
DBG(SCpnt,printk("scsi%d.%c: starting cmd %02X\n", DBG(SCpnt,printk("scsi%d.%c: starting cmd %02X\n",
host->host->host_no, '0' + SCpnt->target, host->host->host_no, '0' + SCpnt->device->id,
SCpnt->cmnd[0])); SCpnt->cmnd[0]));
#endif #endif
...@@ -775,7 +775,7 @@ intr_ret_t acornscsi_kick(AS_Host *host) ...@@ -775,7 +775,7 @@ intr_ret_t acornscsi_kick(AS_Host *host)
SCpnt->tag = SCpnt->device->current_tag; SCpnt->tag = SCpnt->device->current_tag;
} else } else
#endif #endif
set_bit(SCpnt->target * 8 + SCpnt->lun, host->busyluns); set_bit(SCpnt->device->id * 8 + SCpnt->device->lun, host->busyluns);
host->stats.removes += 1; host->stats.removes += 1;
...@@ -868,7 +868,7 @@ void acornscsi_done(AS_Host *host, Scsi_Cmnd **SCpntp, unsigned int result) ...@@ -868,7 +868,7 @@ void acornscsi_done(AS_Host *host, Scsi_Cmnd **SCpntp, unsigned int result)
host->host->host_no, SCpnt->result); host->host->host_no, SCpnt->result);
print_command(SCpnt->cmnd); print_command(SCpnt->cmnd);
acornscsi_dumpdma(host, "done"); acornscsi_dumpdma(host, "done");
acornscsi_dumplog(host, SCpnt->target); acornscsi_dumplog(host, SCpnt->device->id);
SCpnt->result &= 0xffff; SCpnt->result &= 0xffff;
SCpnt->result |= DID_ERROR << 16; SCpnt->result |= DID_ERROR << 16;
} }
...@@ -878,7 +878,7 @@ void acornscsi_done(AS_Host *host, Scsi_Cmnd **SCpntp, unsigned int result) ...@@ -878,7 +878,7 @@ void acornscsi_done(AS_Host *host, Scsi_Cmnd **SCpntp, unsigned int result)
if (!SCpnt->scsi_done) if (!SCpnt->scsi_done)
panic("scsi%d.H: null scsi_done function in acornscsi_done", host->host->host_no); panic("scsi%d.H: null scsi_done function in acornscsi_done", host->host->host_no);
clear_bit(SCpnt->target * 8 + SCpnt->lun, host->busyluns); clear_bit(SCpnt->device->id * 8 + SCpnt->device->lun, host->busyluns);
SCpnt->scsi_done(SCpnt); SCpnt->scsi_done(SCpnt);
} else } else
...@@ -1035,7 +1035,7 @@ void acornscsi_dma_setup(AS_Host *host, dmadir_t direction) ...@@ -1035,7 +1035,7 @@ void acornscsi_dma_setup(AS_Host *host, dmadir_t direction)
if (direction == DMA_OUT) { if (direction == DMA_OUT) {
#if (DEBUG & DEBUG_NO_WRITE) #if (DEBUG & DEBUG_NO_WRITE)
if (NO_WRITE & (1 << host->SCpnt->target)) { if (NO_WRITE & (1 << host->SCpnt->device->id)) {
printk(KERN_CRIT "scsi%d.%c: I can't handle DMA_OUT!\n", printk(KERN_CRIT "scsi%d.%c: I can't handle DMA_OUT!\n",
host->host->host_no, acornscsi_target(host)); host->host->host_no, acornscsi_target(host));
return; return;
...@@ -1511,7 +1511,7 @@ void acornscsi_message(AS_Host *host) ...@@ -1511,7 +1511,7 @@ void acornscsi_message(AS_Host *host)
if (host->scsi.phase != PHASE_STATUSIN) { if (host->scsi.phase != PHASE_STATUSIN) {
printk(KERN_ERR "scsi%d.%c: command complete following non-status in phase?\n", printk(KERN_ERR "scsi%d.%c: command complete following non-status in phase?\n",
host->host->host_no, acornscsi_target(host)); host->host->host_no, acornscsi_target(host));
acornscsi_dumplog(host, host->SCpnt->target); acornscsi_dumplog(host, host->SCpnt->device->id);
} }
host->scsi.phase = PHASE_DONE; host->scsi.phase = PHASE_DONE;
host->scsi.SCp.Message = message[0]; host->scsi.SCp.Message = message[0];
...@@ -1567,8 +1567,8 @@ void acornscsi_message(AS_Host *host) ...@@ -1567,8 +1567,8 @@ void acornscsi_message(AS_Host *host)
* transfer. Re-initiate sync transfer negociation now, and if * transfer. Re-initiate sync transfer negociation now, and if
* we got a REJECT in response to SDTR, then it'll be set to DONE. * we got a REJECT in response to SDTR, then it'll be set to DONE.
*/ */
if (host->device[host->SCpnt->target].sync_state == SYNC_SENT_REQUEST) if (host->device[host->SCpnt->device->id].sync_state == SYNC_SENT_REQUEST)
host->device[host->SCpnt->target].sync_state = SYNC_NEGOCIATE; host->device[host->SCpnt->device->id].sync_state = SYNC_NEGOCIATE;
#endif #endif
/* /*
...@@ -1591,7 +1591,7 @@ void acornscsi_message(AS_Host *host) ...@@ -1591,7 +1591,7 @@ void acornscsi_message(AS_Host *host)
printk(KERN_NOTICE "scsi%d.%c: disabling tagged queueing\n", printk(KERN_NOTICE "scsi%d.%c: disabling tagged queueing\n",
host->host->host_no, acornscsi_target(host)); host->host->host_no, acornscsi_target(host));
host->SCpnt->device->tagged_queue = 0; host->SCpnt->device->tagged_queue = 0;
set_bit(host->SCpnt->target * 8 + host->SCpnt->lun, host->busyluns); set_bit(host->SCpnt->device->id * 8 + host->SCpnt->device->lun, host->busyluns);
break; break;
#endif #endif
case EXTENDED_MESSAGE | (EXTENDED_SDTR << 8): case EXTENDED_MESSAGE | (EXTENDED_SDTR << 8):
...@@ -1600,9 +1600,9 @@ void acornscsi_message(AS_Host *host) ...@@ -1600,9 +1600,9 @@ void acornscsi_message(AS_Host *host)
*/ */
printk(KERN_NOTICE "scsi%d.%c: Using asynchronous transfer\n", printk(KERN_NOTICE "scsi%d.%c: Using asynchronous transfer\n",
host->host->host_no, acornscsi_target(host)); host->host->host_no, acornscsi_target(host));
host->device[host->SCpnt->target].sync_xfer = SYNCHTRANSFER_2DBA; host->device[host->SCpnt->device->id].sync_xfer = SYNCHTRANSFER_2DBA;
host->device[host->SCpnt->target].sync_state = SYNC_ASYNCHRONOUS; host->device[host->SCpnt->device->id].sync_state = SYNC_ASYNCHRONOUS;
sbic_arm_write(host->scsi.io_port, SYNCHTRANSFER, host->device[host->SCpnt->target].sync_xfer); sbic_arm_write(host->scsi.io_port, SYNCHTRANSFER, host->device[host->SCpnt->device->id].sync_xfer);
break; break;
default: default:
...@@ -1625,18 +1625,18 @@ void acornscsi_message(AS_Host *host) ...@@ -1625,18 +1625,18 @@ void acornscsi_message(AS_Host *host)
switch (message[2]) { switch (message[2]) {
#ifdef CONFIG_SCSI_ACORNSCSI_SYNC #ifdef CONFIG_SCSI_ACORNSCSI_SYNC
case EXTENDED_SDTR: case EXTENDED_SDTR:
if (host->device[host->SCpnt->target].sync_state == SYNC_SENT_REQUEST) { if (host->device[host->SCpnt->device->id].sync_state == SYNC_SENT_REQUEST) {
/* /*
* We requested synchronous transfers. This isn't quite right... * We requested synchronous transfers. This isn't quite right...
* We can only say if this succeeded if we proceed on to execute the * We can only say if this succeeded if we proceed on to execute the
* command from this message. If we get a MESSAGE PARITY ERROR, * command from this message. If we get a MESSAGE PARITY ERROR,
* and the target retries fail, then we fallback to asynchronous mode * and the target retries fail, then we fallback to asynchronous mode
*/ */
host->device[host->SCpnt->target].sync_state = SYNC_COMPLETED; host->device[host->SCpnt->device->id].sync_state = SYNC_COMPLETED;
printk(KERN_NOTICE "scsi%d.%c: Using synchronous transfer, offset %d, %d ns\n", printk(KERN_NOTICE "scsi%d.%c: Using synchronous transfer, offset %d, %d ns\n",
host->host->host_no, acornscsi_target(host), host->host->host_no, acornscsi_target(host),
message[4], message[3] * 4); message[4], message[3] * 4);
host->device[host->SCpnt->target].sync_xfer = host->device[host->SCpnt->device->id].sync_xfer =
calc_sync_xfer(message[3] * 4, message[4]); calc_sync_xfer(message[3] * 4, message[4]);
} else { } else {
unsigned char period, length; unsigned char period, length;
...@@ -1649,10 +1649,10 @@ void acornscsi_message(AS_Host *host) ...@@ -1649,10 +1649,10 @@ void acornscsi_message(AS_Host *host)
length = min_t(unsigned int, message[4], sdtr_size); length = min_t(unsigned int, message[4], sdtr_size);
msgqueue_addmsg(&host->scsi.msgs, 5, EXTENDED_MESSAGE, 3, msgqueue_addmsg(&host->scsi.msgs, 5, EXTENDED_MESSAGE, 3,
EXTENDED_SDTR, period, length); EXTENDED_SDTR, period, length);
host->device[host->SCpnt->target].sync_xfer = host->device[host->SCpnt->device->id].sync_xfer =
calc_sync_xfer(period * 4, length); calc_sync_xfer(period * 4, length);
} }
sbic_arm_write(host->scsi.io_port, SYNCHTRANSFER, host->device[host->SCpnt->target].sync_xfer); sbic_arm_write(host->scsi.io_port, SYNCHTRANSFER, host->device[host->SCpnt->device->id].sync_xfer);
break; break;
#else #else
/* We do not accept synchronous transfers. Respond with a /* We do not accept synchronous transfers. Respond with a
...@@ -1738,8 +1738,8 @@ void acornscsi_buildmessages(AS_Host *host) ...@@ -1738,8 +1738,8 @@ void acornscsi_buildmessages(AS_Host *host)
#endif #endif
msgqueue_addmsg(&host->scsi.msgs, 1, msgqueue_addmsg(&host->scsi.msgs, 1,
IDENTIFY(host->device[host->SCpnt->target].disconnect_ok, IDENTIFY(host->device[host->SCpnt->device->id].disconnect_ok,
host->SCpnt->lun)); host->SCpnt->device->lun));
#if 0 #if 0
/* does the device need the current command aborted */ /* does the device need the current command aborted */
...@@ -1764,8 +1764,8 @@ void acornscsi_buildmessages(AS_Host *host) ...@@ -1764,8 +1764,8 @@ void acornscsi_buildmessages(AS_Host *host)
#endif #endif
#ifdef CONFIG_SCSI_ACORNSCSI_SYNC #ifdef CONFIG_SCSI_ACORNSCSI_SYNC
if (host->device[host->SCpnt->target].sync_state == SYNC_NEGOCIATE) { if (host->device[host->SCpnt->device->id].sync_state == SYNC_NEGOCIATE) {
host->device[host->SCpnt->target].sync_state = SYNC_SENT_REQUEST; host->device[host->SCpnt->device->id].sync_state = SYNC_SENT_REQUEST;
msgqueue_addmsg(&host->scsi.msgs, 5, msgqueue_addmsg(&host->scsi.msgs, 5,
EXTENDED_MESSAGE, 3, EXTENDED_SDTR, EXTENDED_MESSAGE, 3, EXTENDED_SDTR,
sdtr_period / 4, sdtr_size); sdtr_period / 4, sdtr_size);
...@@ -1792,7 +1792,7 @@ int acornscsi_starttransfer(AS_Host *host) ...@@ -1792,7 +1792,7 @@ int acornscsi_starttransfer(AS_Host *host)
residual = host->SCpnt->request_bufflen - host->scsi.SCp.scsi_xferred; residual = host->SCpnt->request_bufflen - host->scsi.SCp.scsi_xferred;
sbic_arm_write(host->scsi.io_port, SYNCHTRANSFER, host->device[host->SCpnt->target].sync_xfer); sbic_arm_write(host->scsi.io_port, SYNCHTRANSFER, host->device[host->SCpnt->device->id].sync_xfer);
sbic_arm_writenext(host->scsi.io_port, residual >> 16); sbic_arm_writenext(host->scsi.io_port, residual >> 16);
sbic_arm_writenext(host->scsi.io_port, residual >> 8); sbic_arm_writenext(host->scsi.io_port, residual >> 8);
sbic_arm_writenext(host->scsi.io_port, residual); sbic_arm_writenext(host->scsi.io_port, residual);
...@@ -1828,7 +1828,7 @@ int acornscsi_reconnect(AS_Host *host) ...@@ -1828,7 +1828,7 @@ int acornscsi_reconnect(AS_Host *host)
if (host->SCpnt && !host->scsi.disconnectable) { if (host->SCpnt && !host->scsi.disconnectable) {
printk(KERN_ERR "scsi%d.%d: reconnected while command in " printk(KERN_ERR "scsi%d.%d: reconnected while command in "
"progress to target %d?\n", "progress to target %d?\n",
host->host->host_no, target, host->SCpnt->target); host->host->host_no, target, host->SCpnt->device->id);
host->SCpnt = NULL; host->SCpnt = NULL;
} }
...@@ -1839,7 +1839,7 @@ int acornscsi_reconnect(AS_Host *host) ...@@ -1839,7 +1839,7 @@ int acornscsi_reconnect(AS_Host *host)
host->scsi.reconnected.tag = 0; host->scsi.reconnected.tag = 0;
if (host->scsi.disconnectable && host->SCpnt && if (host->scsi.disconnectable && host->SCpnt &&
host->SCpnt->target == target && host->SCpnt->lun == lun) host->SCpnt->device->id == target && host->SCpnt->device->lun == lun)
ok = 1; ok = 1;
if (!ok && queue_probetgtlun(&host->queues.disconnected, target, lun)) if (!ok && queue_probetgtlun(&host->queues.disconnected, target, lun))
...@@ -1876,9 +1876,9 @@ int acornscsi_reconnect_finish(AS_Host *host) ...@@ -1876,9 +1876,9 @@ int acornscsi_reconnect_finish(AS_Host *host)
{ {
if (host->scsi.disconnectable && host->SCpnt) { if (host->scsi.disconnectable && host->SCpnt) {
host->scsi.disconnectable = 0; host->scsi.disconnectable = 0;
if (host->SCpnt->target == host->scsi.reconnected.target && if (host->SCpnt->device->id == host->scsi.reconnected.target &&
host->SCpnt->lun == host->scsi.reconnected.lun && host->SCpnt->device->lun == host->scsi.reconnected.lun &&
host->SCpnt->tag == host->scsi.reconnected.tag) { host->SCpnt->tag == host->scsi.reconnected.tag) {
#if (DEBUG & (DEBUG_QUEUES|DEBUG_DISCON)) #if (DEBUG & (DEBUG_QUEUES|DEBUG_DISCON))
DBG(host->SCpnt, printk("scsi%d.%c: reconnected", DBG(host->SCpnt, printk("scsi%d.%c: reconnected",
host->host->host_no, acornscsi_target(host))); host->host->host_no, acornscsi_target(host)));
...@@ -1992,7 +1992,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq) ...@@ -1992,7 +1992,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
ADD_STATUS(8, ssr, host->scsi.phase, in_irq); ADD_STATUS(8, ssr, host->scsi.phase, in_irq);
if (host->SCpnt && !host->scsi.disconnectable) if (host->SCpnt && !host->scsi.disconnectable)
ADD_STATUS(host->SCpnt->target, ssr, host->scsi.phase, in_irq); ADD_STATUS(host->SCpnt->device->id, ssr, host->scsi.phase, in_irq);
switch (ssr) { switch (ssr) {
case 0x00: /* reset state - not advanced */ case 0x00: /* reset state - not advanced */
...@@ -2030,7 +2030,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq) ...@@ -2030,7 +2030,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
break; break;
ssr = sbic_arm_read(host->scsi.io_port, SSR); ssr = sbic_arm_read(host->scsi.io_port, SSR);
ADD_STATUS(8, ssr, host->scsi.phase, 1); ADD_STATUS(8, ssr, host->scsi.phase, 1);
ADD_STATUS(host->SCpnt->target, ssr, host->scsi.phase, 1); ADD_STATUS(host->SCpnt->device->id, ssr, host->scsi.phase, 1);
goto connected; goto connected;
case 0x42: /* select timed out */ case 0x42: /* select timed out */
...@@ -2049,7 +2049,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq) ...@@ -2049,7 +2049,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
default: default:
printk(KERN_ERR "scsi%d.%c: PHASE_CONNECTING, SSR %02X?\n", printk(KERN_ERR "scsi%d.%c: PHASE_CONNECTING, SSR %02X?\n",
host->host->host_no, acornscsi_target(host), ssr); host->host->host_no, acornscsi_target(host), ssr);
acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->target : 8); acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8);
acornscsi_abortcmd(host, host->SCpnt->tag); acornscsi_abortcmd(host, host->SCpnt->tag);
} }
return INTR_PROCESSING; return INTR_PROCESSING;
...@@ -2085,7 +2085,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq) ...@@ -2085,7 +2085,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
default: default:
printk(KERN_ERR "scsi%d.%c: PHASE_CONNECTED, SSR %02X?\n", printk(KERN_ERR "scsi%d.%c: PHASE_CONNECTED, SSR %02X?\n",
host->host->host_no, acornscsi_target(host), ssr); host->host->host_no, acornscsi_target(host), ssr);
acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->target : 8); acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8);
acornscsi_abortcmd(host, host->SCpnt->tag); acornscsi_abortcmd(host, host->SCpnt->tag);
} }
return INTR_PROCESSING; return INTR_PROCESSING;
...@@ -2123,7 +2123,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq) ...@@ -2123,7 +2123,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
default: default:
printk(KERN_ERR "scsi%d.%c: PHASE_MSGOUT, SSR %02X?\n", printk(KERN_ERR "scsi%d.%c: PHASE_MSGOUT, SSR %02X?\n",
host->host->host_no, acornscsi_target(host), ssr); host->host->host_no, acornscsi_target(host), ssr);
acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->target : 8); acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8);
} }
return INTR_PROCESSING; return INTR_PROCESSING;
...@@ -2168,7 +2168,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq) ...@@ -2168,7 +2168,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
default: default:
printk(KERN_ERR "scsi%d.%c: PHASE_COMMAND, SSR %02X?\n", printk(KERN_ERR "scsi%d.%c: PHASE_COMMAND, SSR %02X?\n",
host->host->host_no, acornscsi_target(host), ssr); host->host->host_no, acornscsi_target(host), ssr);
acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->target : 8); acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8);
} }
return INTR_PROCESSING; return INTR_PROCESSING;
...@@ -2181,7 +2181,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq) ...@@ -2181,7 +2181,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
} else { } else {
printk(KERN_ERR "scsi%d.%c: PHASE_DISCONNECT, SSR %02X instead of disconnect?\n", printk(KERN_ERR "scsi%d.%c: PHASE_DISCONNECT, SSR %02X instead of disconnect?\n",
host->host->host_no, acornscsi_target(host), ssr); host->host->host_no, acornscsi_target(host), ssr);
acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->target : 8); acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8);
} }
return INTR_NEXT_COMMAND; return INTR_NEXT_COMMAND;
...@@ -2191,7 +2191,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq) ...@@ -2191,7 +2191,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
else { else {
printk(KERN_ERR "scsi%d.%c: PHASE_IDLE, SSR %02X while idle?\n", printk(KERN_ERR "scsi%d.%c: PHASE_IDLE, SSR %02X while idle?\n",
host->host->host_no, acornscsi_target(host), ssr); host->host->host_no, acornscsi_target(host), ssr);
acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->target : 8); acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8);
} }
return INTR_PROCESSING; return INTR_PROCESSING;
...@@ -2206,7 +2206,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq) ...@@ -2206,7 +2206,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
*/ */
if (ssr != 0x8f && !acornscsi_reconnect_finish(host)) if (ssr != 0x8f && !acornscsi_reconnect_finish(host))
return INTR_IDLE; return INTR_IDLE;
ADD_STATUS(host->SCpnt->target, ssr, host->scsi.phase, in_irq); ADD_STATUS(host->SCpnt->device->id, ssr, host->scsi.phase, in_irq);
switch (ssr) { switch (ssr) {
case 0x88: /* data out phase */ case 0x88: /* data out phase */
/* -> PHASE_DATAOUT */ /* -> PHASE_DATAOUT */
...@@ -2251,7 +2251,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq) ...@@ -2251,7 +2251,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
default: default:
printk(KERN_ERR "scsi%d.%c: PHASE_RECONNECTED, SSR %02X after reconnect?\n", printk(KERN_ERR "scsi%d.%c: PHASE_RECONNECTED, SSR %02X after reconnect?\n",
host->host->host_no, acornscsi_target(host), ssr); host->host->host_no, acornscsi_target(host), ssr);
acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->target : 8); acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8);
} }
return INTR_PROCESSING; return INTR_PROCESSING;
...@@ -2300,7 +2300,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq) ...@@ -2300,7 +2300,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
default: default:
printk(KERN_ERR "scsi%d.%c: PHASE_DATAIN, SSR %02X?\n", printk(KERN_ERR "scsi%d.%c: PHASE_DATAIN, SSR %02X?\n",
host->host->host_no, acornscsi_target(host), ssr); host->host->host_no, acornscsi_target(host), ssr);
acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->target : 8); acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8);
} }
return INTR_PROCESSING; return INTR_PROCESSING;
...@@ -2352,7 +2352,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq) ...@@ -2352,7 +2352,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
default: default:
printk(KERN_ERR "scsi%d.%c: PHASE_DATAOUT, SSR %02X?\n", printk(KERN_ERR "scsi%d.%c: PHASE_DATAOUT, SSR %02X?\n",
host->host->host_no, acornscsi_target(host), ssr); host->host->host_no, acornscsi_target(host), ssr);
acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->target : 8); acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8);
} }
return INTR_PROCESSING; return INTR_PROCESSING;
...@@ -2373,7 +2373,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq) ...@@ -2373,7 +2373,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
default: default:
printk(KERN_ERR "scsi%d.%c: PHASE_STATUSIN, SSR %02X instead of MESSAGE_IN?\n", printk(KERN_ERR "scsi%d.%c: PHASE_STATUSIN, SSR %02X instead of MESSAGE_IN?\n",
host->host->host_no, acornscsi_target(host), ssr); host->host->host_no, acornscsi_target(host), ssr);
acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->target : 8); acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8);
} }
return INTR_PROCESSING; return INTR_PROCESSING;
...@@ -2396,14 +2396,14 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq) ...@@ -2396,14 +2396,14 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
case 0x85: case 0x85:
printk("scsi%d.%c: strange message in disconnection\n", printk("scsi%d.%c: strange message in disconnection\n",
host->host->host_no, acornscsi_target(host)); host->host->host_no, acornscsi_target(host));
acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->target : 8); acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8);
acornscsi_done(host, &host->SCpnt, DID_ERROR); acornscsi_done(host, &host->SCpnt, DID_ERROR);
break; break;
default: default:
printk(KERN_ERR "scsi%d.%c: PHASE_MSGIN, SSR %02X after message in?\n", printk(KERN_ERR "scsi%d.%c: PHASE_MSGIN, SSR %02X after message in?\n",
host->host->host_no, acornscsi_target(host), ssr); host->host->host_no, acornscsi_target(host), ssr);
acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->target : 8); acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8);
} }
return INTR_PROCESSING; return INTR_PROCESSING;
...@@ -2421,7 +2421,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq) ...@@ -2421,7 +2421,7 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
default: default:
printk(KERN_ERR "scsi%d.%c: PHASE_DONE, SSR %02X instead of disconnect?\n", printk(KERN_ERR "scsi%d.%c: PHASE_DONE, SSR %02X instead of disconnect?\n",
host->host->host_no, acornscsi_target(host), ssr); host->host->host_no, acornscsi_target(host), ssr);
acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->target : 8); acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8);
} }
return INTR_PROCESSING; return INTR_PROCESSING;
...@@ -2447,14 +2447,14 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq) ...@@ -2447,14 +2447,14 @@ intr_ret_t acornscsi_sbicintr(AS_Host *host, int in_irq)
default: default:
printk(KERN_ERR "scsi%d.%c: PHASE_ABORTED, SSR %02X?\n", printk(KERN_ERR "scsi%d.%c: PHASE_ABORTED, SSR %02X?\n",
host->host->host_no, acornscsi_target(host), ssr); host->host->host_no, acornscsi_target(host), ssr);
acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->target : 8); acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8);
} }
return INTR_PROCESSING; return INTR_PROCESSING;
default: default:
printk(KERN_ERR "scsi%d.%c: unknown driver phase %d\n", printk(KERN_ERR "scsi%d.%c: unknown driver phase %d\n",
host->host->host_no, acornscsi_target(host), ssr); host->host->host_no, acornscsi_target(host), ssr);
acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->target : 8); acornscsi_dumplog(host, host->SCpnt ? host->SCpnt->device->id : 8);
} }
return INTR_PROCESSING; return INTR_PROCESSING;
} }
...@@ -2531,9 +2531,9 @@ int acornscsi_queuecmd(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) ...@@ -2531,9 +2531,9 @@ int acornscsi_queuecmd(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
} }
#if (DEBUG & DEBUG_NO_WRITE) #if (DEBUG & DEBUG_NO_WRITE)
if (acornscsi_cmdtype(SCpnt->cmnd[0]) == CMD_WRITE && (NO_WRITE & (1 << SCpnt->target))) { if (acornscsi_cmdtype(SCpnt->cmnd[0]) == CMD_WRITE && (NO_WRITE & (1 << SCpnt->device->id))) {
printk(KERN_CRIT "scsi%d.%c: WRITE attempted with NO_WRITE flag set\n", printk(KERN_CRIT "scsi%d.%c: WRITE attempted with NO_WRITE flag set\n",
SCpnt->host->host_no, '0' + SCpnt->target); SCpnt->host->host_no, '0' + SCpnt->device->id);
SCpnt->result = DID_NO_CONNECT << 16; SCpnt->result = DID_NO_CONNECT << 16;
done(SCpnt); done(SCpnt);
return 0; return 0;
...@@ -2708,7 +2708,7 @@ int acornscsi_abort(Scsi_Cmnd *SCpnt) ...@@ -2708,7 +2708,7 @@ int acornscsi_abort(Scsi_Cmnd *SCpnt)
printk(KERN_WARNING "acornscsi_abort: "); printk(KERN_WARNING "acornscsi_abort: ");
print_sbic_status(asr, ssr, host->scsi.phase); print_sbic_status(asr, ssr, host->scsi.phase);
acornscsi_dumplog(host, SCpnt->target); acornscsi_dumplog(host, SCpnt->device->id);
} }
#endif #endif
...@@ -2724,7 +2724,7 @@ int acornscsi_abort(Scsi_Cmnd *SCpnt) ...@@ -2724,7 +2724,7 @@ int acornscsi_abort(Scsi_Cmnd *SCpnt)
//#if (DEBUG & DEBUG_ABORT) //#if (DEBUG & DEBUG_ABORT)
printk("clear "); printk("clear ");
//#endif //#endif
clear_bit(SCpnt->target * 8 + SCpnt->lun, host->busyluns); clear_bit(SCpnt->device->id * 8 + SCpnt->device->lun, host->busyluns);
/* /*
* We found the command, and cleared it out. Either * We found the command, and cleared it out. Either
...@@ -2758,7 +2758,7 @@ int acornscsi_abort(Scsi_Cmnd *SCpnt) ...@@ -2758,7 +2758,7 @@ int acornscsi_abort(Scsi_Cmnd *SCpnt)
*/ */
default: default:
case res_not_running: case res_not_running:
acornscsi_dumplog(host, SCpnt->target); acornscsi_dumplog(host, SCpnt->device->id);
#if (DEBUG & DEBUG_ABORT) #if (DEBUG & DEBUG_ABORT)
result = SCSI_ABORT_SNOOZE; result = SCSI_ABORT_SNOOZE;
#else #else
...@@ -2796,7 +2796,7 @@ int acornscsi_reset(Scsi_Cmnd *SCpnt, unsigned int reset_flags) ...@@ -2796,7 +2796,7 @@ int acornscsi_reset(Scsi_Cmnd *SCpnt, unsigned int reset_flags)
printk(KERN_WARNING "acornscsi_reset: "); printk(KERN_WARNING "acornscsi_reset: ");
print_sbic_status(asr, ssr, host->scsi.phase); print_sbic_status(asr, ssr, host->scsi.phase);
acornscsi_dumplog(host, SCpnt->target); acornscsi_dumplog(host, SCpnt->device->id);
} }
#endif #endif
......
...@@ -96,6 +96,47 @@ ...@@ -96,6 +96,47 @@
static int level_mask = LOG_ERROR; static int level_mask = LOG_ERROR;
static int __init fas216_log_setup(char *str)
{
char *s;
level_mask = 0;
while ((s = strsep(&str, ",")) != NULL) {
switch (s[0]) {
case 'a':
if (strcmp(s, "all") == 0)
level_mask |= -1;
break;
case 'b':
if (strncmp(s, "bus", 3) == 0)
level_mask |= LOG_BUSSERVICE;
if (strncmp(s, "buf", 3) == 0)
level_mask |= LOG_BUFFER;
break;
case 'c':
level_mask |= LOG_CONNECT;
break;
case 'e':
level_mask |= LOG_ERROR;
break;
case 'm':
level_mask |= LOG_MESSAGES;
break;
case 'n':
if (strcmp(s, "none") == 0)
level_mask = 0;
break;
case 's':
level_mask |= LOG_FUNCTIONDONE;
break;
}
}
return 1;
}
__setup("fas216_logging=", fas216_log_setup);
static inline unsigned char fas216_readb(FAS216_Info *info, unsigned int reg) static inline unsigned char fas216_readb(FAS216_Info *info, unsigned int reg)
{ {
unsigned int off = reg << info->scsi.io_shift; unsigned int off = reg << info->scsi.io_shift;
...@@ -244,7 +285,7 @@ static const char *fas216_drv_phase(FAS216_Info *info) ...@@ -244,7 +285,7 @@ static const char *fas216_drv_phase(FAS216_Info *info)
static char fas216_target(FAS216_Info *info) static char fas216_target(FAS216_Info *info)
{ {
if (info->SCpnt) if (info->SCpnt)
return '0' + info->SCpnt->target; return '0' + info->SCpnt->device->id;
else else
return 'H'; return 'H';
} }
...@@ -267,7 +308,7 @@ fas216_log_command(FAS216_Info *info, int level, Scsi_Cmnd *SCpnt, char *fmt, .. ...@@ -267,7 +308,7 @@ fas216_log_command(FAS216_Info *info, int level, Scsi_Cmnd *SCpnt, char *fmt, ..
return; return;
va_start(args, fmt); va_start(args, fmt);
fas216_do_log(info, '0' + SCpnt->target, fmt, args); fas216_do_log(info, '0' + SCpnt->device->id, fmt, args);
va_end(args); va_end(args);
printk(" CDB: "); printk(" CDB: ");
...@@ -495,7 +536,7 @@ static void fas216_set_sync(FAS216_Info *info, int target) ...@@ -495,7 +536,7 @@ static void fas216_set_sync(FAS216_Info *info, int target)
*/ */
static void fas216_handlesync(FAS216_Info *info, char *msg) static void fas216_handlesync(FAS216_Info *info, char *msg)
{ {
struct fas216_device *dev = &info->device[info->SCpnt->target]; struct fas216_device *dev = &info->device[info->SCpnt->device->id];
enum { sync, async, none, reject } res = none; enum { sync, async, none, reject } res = none;
#ifdef SCSI2_SYNC #ifdef SCSI2_SYNC
...@@ -578,7 +619,7 @@ static void fas216_handlesync(FAS216_Info *info, char *msg) ...@@ -578,7 +619,7 @@ static void fas216_handlesync(FAS216_Info *info, char *msg)
dev->period = msg[3]; dev->period = msg[3];
dev->sof = msg[4]; dev->sof = msg[4];
dev->stp = fas216_syncperiod(info, msg[3] * 4); dev->stp = fas216_syncperiod(info, msg[3] * 4);
fas216_set_sync(info, info->SCpnt->target); fas216_set_sync(info, info->SCpnt->device->id);
break; break;
case reject: case reject:
...@@ -591,7 +632,7 @@ static void fas216_handlesync(FAS216_Info *info, char *msg) ...@@ -591,7 +632,7 @@ static void fas216_handlesync(FAS216_Info *info, char *msg)
dev->period = info->ifcfg.asyncperiod / 4; dev->period = info->ifcfg.asyncperiod / 4;
dev->sof = 0; dev->sof = 0;
dev->stp = info->scsi.async_stp; dev->stp = info->scsi.async_stp;
fas216_set_sync(info, info->SCpnt->target); fas216_set_sync(info, info->SCpnt->device->id);
break; break;
case none: case none:
...@@ -608,7 +649,7 @@ static void fas216_handlesync(FAS216_Info *info, char *msg) ...@@ -608,7 +649,7 @@ static void fas216_handlesync(FAS216_Info *info, char *msg)
*/ */
static void fas216_handlewide(FAS216_Info *info, char *msg) static void fas216_handlewide(FAS216_Info *info, char *msg)
{ {
struct fas216_device *dev = &info->device[info->SCpnt->target]; struct fas216_device *dev = &info->device[info->SCpnt->device->id];
enum { wide, bit8, none, reject } res = none; enum { wide, bit8, none, reject } res = none;
#ifdef SCSI2_WIDE #ifdef SCSI2_WIDE
...@@ -725,7 +766,7 @@ static void fas216_updateptrs(FAS216_Info *info, int bytes_transferred) ...@@ -725,7 +766,7 @@ static void fas216_updateptrs(FAS216_Info *info, int bytes_transferred)
bytes_transferred -= SCp->this_residual; bytes_transferred -= SCp->this_residual;
if (!next_SCp(SCp) && bytes_transferred) { if (!next_SCp(SCp) && bytes_transferred) {
printk(KERN_WARNING "scsi%d.%c: out of buffers\n", printk(KERN_WARNING "scsi%d.%c: out of buffers\n",
info->host->host_no, '0' + info->SCpnt->target); info->host->host_no, '0' + info->SCpnt->device->id);
return; return;
} }
} }
...@@ -848,7 +889,7 @@ static void fas216_transfer(FAS216_Info *info) ...@@ -848,7 +889,7 @@ static void fas216_transfer(FAS216_Info *info)
* use DMA mode. If we are using asynchronous transfers, we may * use DMA mode. If we are using asynchronous transfers, we may
* use DMA mode or PIO mode. * use DMA mode or PIO mode.
*/ */
if (info->device[info->SCpnt->target].sof) if (info->device[info->SCpnt->device->id].sof)
dmatype = fasdma_real_all; dmatype = fasdma_real_all;
else else
dmatype = fasdma_pio; dmatype = fasdma_pio;
...@@ -1023,10 +1064,10 @@ fas216_reselected_intr(FAS216_Info *info) ...@@ -1023,10 +1064,10 @@ fas216_reselected_intr(FAS216_Info *info)
info->origSCpnt = SCpnt; info->origSCpnt = SCpnt;
info->SCpnt = NULL; info->SCpnt = NULL;
if (info->device[SCpnt->target].wide_state == neg_inprogress) if (info->device[SCpnt->device->id].wide_state == neg_inprogress)
info->device[SCpnt->target].wide_state = neg_wait; info->device[SCpnt->device->id].wide_state = neg_wait;
if (info->device[SCpnt->target].sync_state == neg_inprogress) if (info->device[SCpnt->device->id].sync_state == neg_inprogress)
info->device[SCpnt->target].sync_state = neg_wait; info->device[SCpnt->device->id].sync_state = neg_wait;
} }
fas216_log(info, LOG_CONNECT, "reconnect phase=%02X", info->scsi.phase); fas216_log(info, LOG_CONNECT, "reconnect phase=%02X", info->scsi.phase);
...@@ -1073,7 +1114,7 @@ fas216_reselected_intr(FAS216_Info *info) ...@@ -1073,7 +1114,7 @@ fas216_reselected_intr(FAS216_Info *info)
ok = 0; ok = 0;
if (info->scsi.disconnectable && info->SCpnt && if (info->scsi.disconnectable && info->SCpnt &&
info->SCpnt->target == target && info->SCpnt->lun == identify_msg) info->SCpnt->device->id == target && info->SCpnt->device->lun == identify_msg)
ok = 1; ok = 1;
if (!ok && queue_probetgtlun(&info->queues.disconnected, target, identify_msg)) if (!ok && queue_probetgtlun(&info->queues.disconnected, target, identify_msg))
...@@ -1118,15 +1159,15 @@ fas216_finish_reconnect(FAS216_Info *info) ...@@ -1118,15 +1159,15 @@ fas216_finish_reconnect(FAS216_Info *info)
fas216_checkmagic(info); fas216_checkmagic(info);
fas216_log(info, LOG_CONNECT, "Connected: %1x %1x %02x, reconnected: %1x %1x %02x", fas216_log(info, LOG_CONNECT, "Connected: %1x %1x %02x, reconnected: %1x %1x %02x",
info->SCpnt->target, info->SCpnt->lun, info->SCpnt->tag, info->SCpnt->device->id, info->SCpnt->device->lun, info->SCpnt->tag,
info->scsi.reconnected.target, info->scsi.reconnected.lun, info->scsi.reconnected.target, info->scsi.reconnected.lun,
info->scsi.reconnected.tag); info->scsi.reconnected.tag);
if (info->scsi.disconnectable && info->SCpnt) { if (info->scsi.disconnectable && info->SCpnt) {
info->scsi.disconnectable = 0; info->scsi.disconnectable = 0;
if (info->SCpnt->target == info->scsi.reconnected.target && if (info->SCpnt->device->id == info->scsi.reconnected.target &&
info->SCpnt->lun == info->scsi.reconnected.lun && info->SCpnt->device->lun == info->scsi.reconnected.lun &&
info->SCpnt->tag == info->scsi.reconnected.tag) { info->SCpnt->tag == info->scsi.reconnected.tag) {
fas216_log(info, LOG_CONNECT, "reconnected"); fas216_log(info, LOG_CONNECT, "reconnected");
} else { } else {
queue_add_cmd_tail(&info->queues.disconnected, info->SCpnt); queue_add_cmd_tail(&info->queues.disconnected, info->SCpnt);
...@@ -1617,13 +1658,13 @@ static void fas216_busservice_intr(FAS216_Info *info, unsigned int stat, unsigne ...@@ -1617,13 +1658,13 @@ static void fas216_busservice_intr(FAS216_Info *info, unsigned int stat, unsigne
* set of messages. If we have more than one byte to * set of messages. If we have more than one byte to
* send, we need to assert ATN again. * send, we need to assert ATN again.
*/ */
if (info->device[info->SCpnt->target].parity_check) { if (info->device[info->SCpnt->device->id].parity_check) {
/* /*
* We were testing... good, the device * We were testing... good, the device
* supports parity checking. * supports parity checking.
*/ */
info->device[info->SCpnt->target].parity_check = 0; info->device[info->SCpnt->device->id].parity_check = 0;
info->device[info->SCpnt->target].parity_enabled = 1; info->device[info->SCpnt->device->id].parity_enabled = 1;
fas216_writeb(info, REG_CNTL1, info->scsi.cfg[0]); fas216_writeb(info, REG_CNTL1, info->scsi.cfg[0]);
} }
...@@ -1831,11 +1872,11 @@ static void __fas216_start_command(FAS216_Info *info, Scsi_Cmnd *SCpnt) ...@@ -1831,11 +1872,11 @@ static void __fas216_start_command(FAS216_Info *info, Scsi_Cmnd *SCpnt)
fas216_cmd(info, CMD_FLUSHFIFO); fas216_cmd(info, CMD_FLUSHFIFO);
/* load bus-id and timeout */ /* load bus-id and timeout */
fas216_writeb(info, REG_SDID, BUSID(SCpnt->target)); fas216_writeb(info, REG_SDID, BUSID(SCpnt->device->id));
fas216_writeb(info, REG_STIM, info->ifcfg.select_timeout); fas216_writeb(info, REG_STIM, info->ifcfg.select_timeout);
/* synchronous transfers */ /* synchronous transfers */
fas216_set_sync(info, SCpnt->target); fas216_set_sync(info, SCpnt->device->id);
tot_msglen = msgqueue_msglength(&info->scsi.msgs); tot_msglen = msgqueue_msglength(&info->scsi.msgs);
...@@ -1845,7 +1886,7 @@ static void __fas216_start_command(FAS216_Info *info, Scsi_Cmnd *SCpnt) ...@@ -1845,7 +1886,7 @@ static void __fas216_start_command(FAS216_Info *info, Scsi_Cmnd *SCpnt)
int msgnr = 0, i; int msgnr = 0, i;
printk("scsi%d.%c: message out: ", printk("scsi%d.%c: message out: ",
info->host->host_no, '0' + SCpnt->target); info->host->host_no, '0' + SCpnt->device->id);
while ((msg = msgqueue_getmsg(&info->scsi.msgs, msgnr++)) != NULL) { while ((msg = msgqueue_getmsg(&info->scsi.msgs, msgnr++)) != NULL) {
printk("{ "); printk("{ ");
for (i = 0; i < msg->length; i++) for (i = 0; i < msg->length; i++)
...@@ -1923,7 +1964,7 @@ static void fas216_start_command(FAS216_Info *info, Scsi_Cmnd *SCpnt) ...@@ -1923,7 +1964,7 @@ static void fas216_start_command(FAS216_Info *info, Scsi_Cmnd *SCpnt)
info->SCpnt = SCpnt; info->SCpnt = SCpnt;
info->dma.transfer_type = fasdma_none; info->dma.transfer_type = fasdma_none;
if (parity_test(info, SCpnt->target)) if (parity_test(info, SCpnt->device->id))
fas216_writeb(info, REG_CNTL1, info->scsi.cfg[0] | CNTL1_PTE); fas216_writeb(info, REG_CNTL1, info->scsi.cfg[0] | CNTL1_PTE);
else else
fas216_writeb(info, REG_CNTL1, info->scsi.cfg[0]); fas216_writeb(info, REG_CNTL1, info->scsi.cfg[0]);
...@@ -1932,13 +1973,13 @@ static void fas216_start_command(FAS216_Info *info, Scsi_Cmnd *SCpnt) ...@@ -1932,13 +1973,13 @@ static void fas216_start_command(FAS216_Info *info, Scsi_Cmnd *SCpnt)
* Don't allow request sense commands to disconnect. * Don't allow request sense commands to disconnect.
*/ */
disconnect_ok = SCpnt->cmnd[0] != REQUEST_SENSE && disconnect_ok = SCpnt->cmnd[0] != REQUEST_SENSE &&
info->device[SCpnt->target].disconnect_ok; info->device[SCpnt->device->id].disconnect_ok;
/* /*
* build outgoing message bytes * build outgoing message bytes
*/ */
msgqueue_flush(&info->scsi.msgs); msgqueue_flush(&info->scsi.msgs);
msgqueue_addmsg(&info->scsi.msgs, 1, IDENTIFY(disconnect_ok, SCpnt->lun)); msgqueue_addmsg(&info->scsi.msgs, 1, IDENTIFY(disconnect_ok, SCpnt->device->lun));
/* /*
* add tag message if required * add tag message if required
...@@ -1948,8 +1989,8 @@ static void fas216_start_command(FAS216_Info *info, Scsi_Cmnd *SCpnt) ...@@ -1948,8 +1989,8 @@ static void fas216_start_command(FAS216_Info *info, Scsi_Cmnd *SCpnt)
do { do {
#ifdef SCSI2_WIDE #ifdef SCSI2_WIDE
if (info->device[SCpnt->target].wide_state == neg_wait) { if (info->device[SCpnt->device->id].wide_state == neg_wait) {
info->device[SCpnt->target].wide_state = neg_inprogress; info->device[SCpnt->device->id].wide_state = neg_inprogress;
msgqueue_addmsg(&info->scsi.msgs, 4, msgqueue_addmsg(&info->scsi.msgs, 4,
EXTENDED_MESSAGE, 2, EXTENDED_WDTR, EXTENDED_MESSAGE, 2, EXTENDED_WDTR,
info->ifcfg.wide_max_size); info->ifcfg.wide_max_size);
...@@ -1957,11 +1998,11 @@ static void fas216_start_command(FAS216_Info *info, Scsi_Cmnd *SCpnt) ...@@ -1957,11 +1998,11 @@ static void fas216_start_command(FAS216_Info *info, Scsi_Cmnd *SCpnt)
} }
#endif #endif
#ifdef SCSI2_SYNC #ifdef SCSI2_SYNC
if ((info->device[SCpnt->target].sync_state == neg_wait || if ((info->device[SCpnt->device->id].sync_state == neg_wait ||
info->device[SCpnt->target].sync_state == neg_complete) && info->device[SCpnt->device->id].sync_state == neg_complete) &&
(SCpnt->cmnd[0] == REQUEST_SENSE || (SCpnt->cmnd[0] == REQUEST_SENSE ||
SCpnt->cmnd[0] == INQUIRY)) { SCpnt->cmnd[0] == INQUIRY)) {
info->device[SCpnt->target].sync_state = neg_inprogress; info->device[SCpnt->device->id].sync_state = neg_inprogress;
msgqueue_addmsg(&info->scsi.msgs, 5, msgqueue_addmsg(&info->scsi.msgs, 5,
EXTENDED_MESSAGE, 3, EXTENDED_SDTR, EXTENDED_MESSAGE, 3, EXTENDED_SDTR,
1000 / info->ifcfg.clockrate, 1000 / info->ifcfg.clockrate,
...@@ -1988,7 +2029,7 @@ static void fas216_allocate_tag(FAS216_Info *info, Scsi_Cmnd *SCpnt) ...@@ -1988,7 +2029,7 @@ static void fas216_allocate_tag(FAS216_Info *info, Scsi_Cmnd *SCpnt)
SCpnt->tag = SCpnt->device->current_tag; SCpnt->tag = SCpnt->device->current_tag;
} else } else
#endif #endif
set_bit(SCpnt->target * 8 + SCpnt->lun, info->busyluns); set_bit(SCpnt->device->id * 8 + SCpnt->device->lun, info->busyluns);
info->stats.removes += 1; info->stats.removes += 1;
switch (SCpnt->cmnd[0]) { switch (SCpnt->cmnd[0]) {
...@@ -2033,11 +2074,11 @@ static void fas216_do_bus_device_reset(FAS216_Info *info, Scsi_Cmnd *SCpnt) ...@@ -2033,11 +2074,11 @@ static void fas216_do_bus_device_reset(FAS216_Info *info, Scsi_Cmnd *SCpnt)
fas216_cmd(info, CMD_FLUSHFIFO); fas216_cmd(info, CMD_FLUSHFIFO);
/* load bus-id and timeout */ /* load bus-id and timeout */
fas216_writeb(info, REG_SDID, BUSID(SCpnt->target)); fas216_writeb(info, REG_SDID, BUSID(SCpnt->device->id));
fas216_writeb(info, REG_STIM, info->ifcfg.select_timeout); fas216_writeb(info, REG_STIM, info->ifcfg.select_timeout);
/* synchronous transfers */ /* synchronous transfers */
fas216_set_sync(info, SCpnt->target); fas216_set_sync(info, SCpnt->device->id);
msg = msgqueue_getmsg(&info->scsi.msgs, 0); msg = msgqueue_getmsg(&info->scsi.msgs, 0);
...@@ -2102,7 +2143,7 @@ static void fas216_kick(FAS216_Info *info) ...@@ -2102,7 +2143,7 @@ static void fas216_kick(FAS216_Info *info)
if (info->scsi.disconnectable && info->SCpnt) { if (info->scsi.disconnectable && info->SCpnt) {
fas216_log(info, LOG_CONNECT, fas216_log(info, LOG_CONNECT,
"moved command for %d to disconnected queue", "moved command for %d to disconnected queue",
info->SCpnt->target); info->SCpnt->device->id);
queue_add_cmd_tail(&info->queues.disconnected, info->SCpnt); queue_add_cmd_tail(&info->queues.disconnected, info->SCpnt);
info->scsi.disconnectable = 0; info->scsi.disconnectable = 0;
info->SCpnt = NULL; info->SCpnt = NULL;
...@@ -2155,7 +2196,7 @@ fas216_devicereset_done(FAS216_Info *info, Scsi_Cmnd *SCpnt, unsigned int result ...@@ -2155,7 +2196,7 @@ fas216_devicereset_done(FAS216_Info *info, Scsi_Cmnd *SCpnt, unsigned int result
static void static void
fas216_rq_sns_done(FAS216_Info *info, Scsi_Cmnd *SCpnt, unsigned int result) fas216_rq_sns_done(FAS216_Info *info, Scsi_Cmnd *SCpnt, unsigned int result)
{ {
fas216_log_target(info, LOG_CONNECT, SCpnt->target, fas216_log_target(info, LOG_CONNECT, SCpnt->device->id,
"request sense complete, result=0x%04x%02x%02x", "request sense complete, result=0x%04x%02x%02x",
result, SCpnt->SCp.Message, SCpnt->SCp.Status); result, SCpnt->SCp.Message, SCpnt->SCp.Status);
...@@ -2166,7 +2207,7 @@ fas216_rq_sns_done(FAS216_Info *info, Scsi_Cmnd *SCpnt, unsigned int result) ...@@ -2166,7 +2207,7 @@ fas216_rq_sns_done(FAS216_Info *info, Scsi_Cmnd *SCpnt, unsigned int result)
* confuse the higher levels. * confuse the higher levels.
*/ */
memset(SCpnt->sense_buffer, 0, sizeof(SCpnt->sense_buffer)); memset(SCpnt->sense_buffer, 0, sizeof(SCpnt->sense_buffer));
//printk("scsi%d.%c: sense buffer: ", info->host->host_no, '0' + SCpnt->target); //printk("scsi%d.%c: sense buffer: ", info->host->host_no, '0' + SCpnt->device->id);
//{ int i; for (i = 0; i < 32; i++) printk("%02x ", SCpnt->sense_buffer[i]); printk("\n"); } //{ int i; for (i = 0; i < 32; i++) printk("%02x ", SCpnt->sense_buffer[i]); printk("\n"); }
/* /*
* Note that we don't set SCpnt->result, since that should * Note that we don't set SCpnt->result, since that should
...@@ -2235,7 +2276,7 @@ fas216_std_done(FAS216_Info *info, Scsi_Cmnd *SCpnt, unsigned int result) ...@@ -2235,7 +2276,7 @@ fas216_std_done(FAS216_Info *info, Scsi_Cmnd *SCpnt, unsigned int result)
default: default:
printk(KERN_ERR "scsi%d.%c: incomplete data transfer " printk(KERN_ERR "scsi%d.%c: incomplete data transfer "
"detected: res=%08X ptr=%p len=%X CDB: ", "detected: res=%08X ptr=%p len=%X CDB: ",
info->host->host_no, '0' + SCpnt->target, info->host->host_no, '0' + SCpnt->device->id,
SCpnt->result, info->scsi.SCp.ptr, SCpnt->result, info->scsi.SCp.ptr,
info->scsi.SCp.this_residual); info->scsi.SCp.this_residual);
print_command(SCpnt->cmnd); print_command(SCpnt->cmnd);
...@@ -2259,11 +2300,11 @@ fas216_std_done(FAS216_Info *info, Scsi_Cmnd *SCpnt, unsigned int result) ...@@ -2259,11 +2300,11 @@ fas216_std_done(FAS216_Info *info, Scsi_Cmnd *SCpnt, unsigned int result)
if (SCpnt->cmnd[0] == REQUEST_SENSE) if (SCpnt->cmnd[0] == REQUEST_SENSE)
goto done; goto done;
fas216_log_target(info, LOG_CONNECT, SCpnt->target, fas216_log_target(info, LOG_CONNECT, SCpnt->device->id,
"requesting sense"); "requesting sense");
memset(SCpnt->cmnd, 0, sizeof (SCpnt->cmnd)); memset(SCpnt->cmnd, 0, sizeof (SCpnt->cmnd));
SCpnt->cmnd[0] = REQUEST_SENSE; SCpnt->cmnd[0] = REQUEST_SENSE;
SCpnt->cmnd[1] = SCpnt->lun << 5; SCpnt->cmnd[1] = SCpnt->device->lun << 5;
SCpnt->cmnd[4] = sizeof(SCpnt->sense_buffer); SCpnt->cmnd[4] = sizeof(SCpnt->sense_buffer);
SCpnt->cmd_len = COMMAND_SIZE(SCpnt->cmnd[0]); SCpnt->cmd_len = COMMAND_SIZE(SCpnt->cmnd[0]);
SCpnt->SCp.buffer = NULL; SCpnt->SCp.buffer = NULL;
...@@ -2285,7 +2326,7 @@ fas216_std_done(FAS216_Info *info, Scsi_Cmnd *SCpnt, unsigned int result) ...@@ -2285,7 +2326,7 @@ fas216_std_done(FAS216_Info *info, Scsi_Cmnd *SCpnt, unsigned int result)
*/ */
if (info->reqSCpnt) if (info->reqSCpnt)
printk(KERN_WARNING "scsi%d.%c: loosing request command\n", printk(KERN_WARNING "scsi%d.%c: loosing request command\n",
info->host->host_no, '0' + SCpnt->target); info->host->host_no, '0' + SCpnt->device->id);
info->reqSCpnt = SCpnt; info->reqSCpnt = SCpnt;
} }
...@@ -2324,7 +2365,7 @@ static void fas216_done(FAS216_Info *info, unsigned int result) ...@@ -2324,7 +2365,7 @@ static void fas216_done(FAS216_Info *info, unsigned int result)
if (info->scsi.SCp.ptr && info->scsi.SCp.this_residual == 0) { if (info->scsi.SCp.ptr && info->scsi.SCp.this_residual == 0) {
printk("scsi%d.%c: zero bytes left to transfer, but " printk("scsi%d.%c: zero bytes left to transfer, but "
"buffer pointer still valid: ptr=%p len=%08x CDB: ", "buffer pointer still valid: ptr=%p len=%08x CDB: ",
info->host->host_no, '0' + SCpnt->target, info->host->host_no, '0' + SCpnt->device->id,
info->scsi.SCp.ptr, info->scsi.SCp.this_residual); info->scsi.SCp.ptr, info->scsi.SCp.this_residual);
info->scsi.SCp.ptr = NULL; info->scsi.SCp.ptr = NULL;
print_command(SCpnt->cmnd); print_command(SCpnt->cmnd);
...@@ -2335,8 +2376,8 @@ static void fas216_done(FAS216_Info *info, unsigned int result) ...@@ -2335,8 +2376,8 @@ static void fas216_done(FAS216_Info *info, unsigned int result)
* the sense information, fas216_kick will re-assert the busy * the sense information, fas216_kick will re-assert the busy
* status. * status.
*/ */
info->device[SCpnt->target].parity_check = 0; info->device[SCpnt->device->id].parity_check = 0;
clear_bit(SCpnt->target * 8 + SCpnt->lun, info->busyluns); clear_bit(SCpnt->device->id * 8 + SCpnt->device->lun, info->busyluns);
fn = (void (*)(FAS216_Info *, Scsi_Cmnd *, unsigned int))SCpnt->host_scribble; fn = (void (*)(FAS216_Info *, Scsi_Cmnd *, unsigned int))SCpnt->host_scribble;
fn(info, SCpnt, result); fn(info, SCpnt, result);
...@@ -2365,7 +2406,7 @@ static void fas216_done(FAS216_Info *info, unsigned int result) ...@@ -2365,7 +2406,7 @@ static void fas216_done(FAS216_Info *info, unsigned int result)
*/ */
int fas216_queue_command(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) int fas216_queue_command(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
{ {
FAS216_Info *info = (FAS216_Info *)SCpnt->host->hostdata; FAS216_Info *info = (FAS216_Info *)SCpnt->device->host->hostdata;
int result; int result;
fas216_checkmagic(info); fas216_checkmagic(info);
...@@ -2412,7 +2453,7 @@ int fas216_queue_command(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *)) ...@@ -2412,7 +2453,7 @@ int fas216_queue_command(Scsi_Cmnd *SCpnt, void (*done)(Scsi_Cmnd *))
*/ */
static void fas216_internal_done(Scsi_Cmnd *SCpnt) static void fas216_internal_done(Scsi_Cmnd *SCpnt)
{ {
FAS216_Info *info = (FAS216_Info *)SCpnt->host->hostdata; FAS216_Info *info = (FAS216_Info *)SCpnt->device->host->hostdata;
fas216_checkmagic(info); fas216_checkmagic(info);
...@@ -2429,7 +2470,7 @@ static void fas216_internal_done(Scsi_Cmnd *SCpnt) ...@@ -2429,7 +2470,7 @@ static void fas216_internal_done(Scsi_Cmnd *SCpnt)
*/ */
int fas216_command(Scsi_Cmnd *SCpnt) int fas216_command(Scsi_Cmnd *SCpnt)
{ {
FAS216_Info *info = (FAS216_Info *)SCpnt->host->hostdata; FAS216_Info *info = (FAS216_Info *)SCpnt->device->host->hostdata;
fas216_checkmagic(info); fas216_checkmagic(info);
...@@ -2555,7 +2596,7 @@ static enum res_find fas216_find_command(FAS216_Info *info, Scsi_Cmnd *SCpnt) ...@@ -2555,7 +2596,7 @@ static enum res_find fas216_find_command(FAS216_Info *info, Scsi_Cmnd *SCpnt)
* been set. * been set.
*/ */
info->origSCpnt = NULL; info->origSCpnt = NULL;
clear_bit(SCpnt->target * 8 + SCpnt->lun, info->busyluns); clear_bit(SCpnt->device->id * 8 + SCpnt->device->lun, info->busyluns);
printk("waiting for execution "); printk("waiting for execution ");
res = res_success; res = res_success;
} else } else
...@@ -2574,7 +2615,7 @@ static enum res_find fas216_find_command(FAS216_Info *info, Scsi_Cmnd *SCpnt) ...@@ -2574,7 +2615,7 @@ static enum res_find fas216_find_command(FAS216_Info *info, Scsi_Cmnd *SCpnt)
*/ */
int fas216_eh_abort(Scsi_Cmnd *SCpnt) int fas216_eh_abort(Scsi_Cmnd *SCpnt)
{ {
FAS216_Info *info = (FAS216_Info *)SCpnt->host->hostdata; FAS216_Info *info = (FAS216_Info *)SCpnt->device->host->hostdata;
int result = FAILED; int result = FAILED;
fas216_checkmagic(info); fas216_checkmagic(info);
...@@ -2631,9 +2672,9 @@ int fas216_eh_abort(Scsi_Cmnd *SCpnt) ...@@ -2631,9 +2672,9 @@ int fas216_eh_abort(Scsi_Cmnd *SCpnt)
*/ */
int fas216_eh_device_reset(Scsi_Cmnd *SCpnt) int fas216_eh_device_reset(Scsi_Cmnd *SCpnt)
{ {
FAS216_Info *info = (FAS216_Info *)SCpnt->host->hostdata; FAS216_Info *info = (FAS216_Info *)SCpnt->device->host->hostdata;
unsigned long flags; unsigned long flags;
int i, res = FAILED, target = SCpnt->target; int i, res = FAILED, target = SCpnt->device->id;
fas216_log(info, LOG_ERROR, "device reset for target %d", target); fas216_log(info, LOG_ERROR, "device reset for target %d", target);
...@@ -2647,7 +2688,7 @@ int fas216_eh_device_reset(Scsi_Cmnd *SCpnt) ...@@ -2647,7 +2688,7 @@ int fas216_eh_device_reset(Scsi_Cmnd *SCpnt)
* and we need a bus reset. * and we need a bus reset.
*/ */
if (info->SCpnt && !info->scsi.disconnectable && if (info->SCpnt && !info->scsi.disconnectable &&
info->SCpnt->target == SCpnt->target) info->SCpnt->device->id == SCpnt->device->id)
break; break;
/* /*
...@@ -2658,9 +2699,9 @@ int fas216_eh_device_reset(Scsi_Cmnd *SCpnt) ...@@ -2658,9 +2699,9 @@ int fas216_eh_device_reset(Scsi_Cmnd *SCpnt)
*/ */
queue_remove_all_target(&info->queues.issue, target); queue_remove_all_target(&info->queues.issue, target);
queue_remove_all_target(&info->queues.disconnected, target); queue_remove_all_target(&info->queues.disconnected, target);
if (info->origSCpnt && info->origSCpnt->target == target) if (info->origSCpnt && info->origSCpnt->device->id == target)
info->origSCpnt = NULL; info->origSCpnt = NULL;
if (info->reqSCpnt && info->reqSCpnt->target == target) if (info->reqSCpnt && info->reqSCpnt->device->id == target)
info->reqSCpnt = NULL; info->reqSCpnt = NULL;
for (i = 0; i < 8; i++) for (i = 0; i < 8; i++)
clear_bit(target * 8 + i, info->busyluns); clear_bit(target * 8 + i, info->busyluns);
...@@ -2712,7 +2753,7 @@ int fas216_eh_device_reset(Scsi_Cmnd *SCpnt) ...@@ -2712,7 +2753,7 @@ int fas216_eh_device_reset(Scsi_Cmnd *SCpnt)
*/ */
int fas216_eh_bus_reset(Scsi_Cmnd *SCpnt) int fas216_eh_bus_reset(Scsi_Cmnd *SCpnt)
{ {
FAS216_Info *info = (FAS216_Info *)SCpnt->host->hostdata; FAS216_Info *info = (FAS216_Info *)SCpnt->device->host->hostdata;
unsigned long flags; unsigned long flags;
Scsi_Device *SDpnt; Scsi_Device *SDpnt;
...@@ -2750,9 +2791,9 @@ int fas216_eh_bus_reset(Scsi_Cmnd *SCpnt) ...@@ -2750,9 +2791,9 @@ int fas216_eh_bus_reset(Scsi_Cmnd *SCpnt)
queue_remove_all_target(&info->queues.issue, SDpnt->id); queue_remove_all_target(&info->queues.issue, SDpnt->id);
queue_remove_all_target(&info->queues.disconnected, SDpnt->id); queue_remove_all_target(&info->queues.disconnected, SDpnt->id);
if (info->origSCpnt && info->origSCpnt->target == SDpnt->id) if (info->origSCpnt && info->origSCpnt->device->id == SDpnt->id)
info->origSCpnt = NULL; info->origSCpnt = NULL;
if (info->reqSCpnt && info->reqSCpnt->target == SDpnt->id) if (info->reqSCpnt && info->reqSCpnt->device->id == SDpnt->id)
info->reqSCpnt = NULL; info->reqSCpnt = NULL;
info->SCpnt = NULL; info->SCpnt = NULL;
...@@ -2809,12 +2850,12 @@ static void fas216_init_chip(FAS216_Info *info) ...@@ -2809,12 +2850,12 @@ static void fas216_init_chip(FAS216_Info *info)
*/ */
int fas216_eh_host_reset(Scsi_Cmnd *SCpnt) int fas216_eh_host_reset(Scsi_Cmnd *SCpnt)
{ {
FAS216_Info *info = (FAS216_Info *)SCpnt->host->hostdata; FAS216_Info *info = (FAS216_Info *)SCpnt->device->host->hostdata;
fas216_checkmagic(info); fas216_checkmagic(info);
printk("scsi%d.%c: %s: resetting host\n", printk("scsi%d.%c: %s: resetting host\n",
info->host->host_no, '0' + SCpnt->target, __FUNCTION__); info->host->host_no, '0' + SCpnt->device->id, __FUNCTION__);
/* /*
* Reset the SCSI chip. * Reset the SCSI chip.
......
...@@ -170,7 +170,7 @@ Scsi_Cmnd *queue_remove_exclude(Queue_t *queue, unsigned long *exclude) ...@@ -170,7 +170,7 @@ Scsi_Cmnd *queue_remove_exclude(Queue_t *queue, unsigned long *exclude)
spin_lock_irqsave(&queue->queue_lock, flags); spin_lock_irqsave(&queue->queue_lock, flags);
list_for_each(l, &queue->head) { list_for_each(l, &queue->head) {
QE_t *q = list_entry(l, QE_t, list); QE_t *q = list_entry(l, QE_t, list);
if (!test_bit(q->SCpnt->target * 8 + q->SCpnt->lun, exclude)) { if (!test_bit(q->SCpnt->device->id * 8 + q->SCpnt->device->lun, exclude)) {
SCpnt = __queue_remove(queue, l); SCpnt = __queue_remove(queue, l);
break; break;
} }
...@@ -217,7 +217,7 @@ Scsi_Cmnd *queue_remove_tgtluntag (Queue_t *queue, int target, int lun, int tag) ...@@ -217,7 +217,7 @@ Scsi_Cmnd *queue_remove_tgtluntag (Queue_t *queue, int target, int lun, int tag)
spin_lock_irqsave(&queue->queue_lock, flags); spin_lock_irqsave(&queue->queue_lock, flags);
list_for_each(l, &queue->head) { list_for_each(l, &queue->head) {
QE_t *q = list_entry(l, QE_t, list); QE_t *q = list_entry(l, QE_t, list);
if (q->SCpnt->target == target && q->SCpnt->lun == lun && if (q->SCpnt->device->id == target && q->SCpnt->device->lun == lun &&
q->SCpnt->tag == tag) { q->SCpnt->tag == tag) {
SCpnt = __queue_remove(queue, l); SCpnt = __queue_remove(queue, l);
break; break;
...@@ -243,7 +243,7 @@ void queue_remove_all_target(Queue_t *queue, int target) ...@@ -243,7 +243,7 @@ void queue_remove_all_target(Queue_t *queue, int target)
spin_lock_irqsave(&queue->queue_lock, flags); spin_lock_irqsave(&queue->queue_lock, flags);
list_for_each(l, &queue->head) { list_for_each(l, &queue->head) {
QE_t *q = list_entry(l, QE_t, list); QE_t *q = list_entry(l, QE_t, list);
if (q->SCpnt->target == target) if (q->SCpnt->device->id == target)
__queue_remove(queue, l); __queue_remove(queue, l);
} }
spin_unlock_irqrestore(&queue->queue_lock, flags); spin_unlock_irqrestore(&queue->queue_lock, flags);
...@@ -267,7 +267,7 @@ int queue_probetgtlun (Queue_t *queue, int target, int lun) ...@@ -267,7 +267,7 @@ int queue_probetgtlun (Queue_t *queue, int target, int lun)
spin_lock_irqsave(&queue->queue_lock, flags); spin_lock_irqsave(&queue->queue_lock, flags);
list_for_each(l, &queue->head) { list_for_each(l, &queue->head) {
QE_t *q = list_entry(l, QE_t, list); QE_t *q = list_entry(l, QE_t, list);
if (q->SCpnt->target == target && q->SCpnt->lun == lun) { if (q->SCpnt->device->id == target && q->SCpnt->device->lun == lun) {
found = 1; found = 1;
break; break;
} }
......
...@@ -92,8 +92,8 @@ static inline void init_SCp(Scsi_Cmnd *SCpnt) ...@@ -92,8 +92,8 @@ static inline void init_SCp(Scsi_Cmnd *SCpnt)
if (SCpnt->request_bufflen != len) if (SCpnt->request_bufflen != len)
printk(KERN_WARNING "scsi%d.%c: bad request buffer " printk(KERN_WARNING "scsi%d.%c: bad request buffer "
"length %d, should be %ld\n", SCpnt->host->host_no, "length %d, should be %ld\n", SCpnt->device->host->host_no,
'0' + SCpnt->target, SCpnt->request_bufflen, len); '0' + SCpnt->device->id, SCpnt->request_bufflen, len);
SCpnt->request_bufflen = len; SCpnt->request_bufflen = len;
#endif #endif
} else { } else {
......
...@@ -37,18 +37,14 @@ ...@@ -37,18 +37,14 @@
*/ */
#undef ONLY_TESTING #undef ONLY_TESTING
#define TIMER_MARGIN 60 /* (secs) Default is 1 minute */ static unsigned int soft_margin = 60; /* in seconds */
static unsigned int reload;
#define FCLK (50*1000*1000) /* 50MHz */ static unsigned long timer_alive;
static int soft_margin = TIMER_MARGIN; /* in seconds */
static int timer_alive;
#ifdef ONLY_TESTING #ifdef ONLY_TESTING
/* /*
* If the timer expires.. * If the timer expires..
*/ */
static void watchdog_fire(int irq, void *dev_id, struct pt_regs *regs) static void watchdog_fire(int irq, void *dev_id, struct pt_regs *regs)
{ {
printk(KERN_CRIT "Watchdog: Would Reboot.\n"); printk(KERN_CRIT "Watchdog: Would Reboot.\n");
...@@ -57,109 +53,134 @@ static void watchdog_fire(int irq, void *dev_id, struct pt_regs *regs) ...@@ -57,109 +53,134 @@ static void watchdog_fire(int irq, void *dev_id, struct pt_regs *regs)
} }
#endif #endif
/*
* Refresh the timer.
*/
static void watchdog_ping(void) static void watchdog_ping(void)
{ {
/* *CSR_TIMER4_LOAD = reload;
* Refresh the timer.
*/
*CSR_TIMER4_LOAD = soft_margin * (FCLK / 256);
} }
/* /*
* Allow only one person to hold it open * Allow only one person to hold it open
*/ */
static int watchdog_open(struct inode *inode, struct file *file) static int watchdog_open(struct inode *inode, struct file *file)
{ {
if(timer_alive) int ret;
if (*CSR_SA110_CNTL & (1 << 13))
return -EBUSY; return -EBUSY;
/*
* Ahead watchdog factor ten, Mr Sulu if (test_and_set_bit(1, &timer_alive))
*/ return -EBUSY;
reload = soft_margin * (mem_fclk_21285 / 256);
*CSR_TIMER4_CLR = 0; *CSR_TIMER4_CLR = 0;
watchdog_ping(); watchdog_ping();
*CSR_TIMER4_CNTL = TIMER_CNTL_ENABLE | TIMER_CNTL_AUTORELOAD *CSR_TIMER4_CNTL = TIMER_CNTL_ENABLE | TIMER_CNTL_AUTORELOAD
| TIMER_CNTL_DIV256; | TIMER_CNTL_DIV256;
#ifdef ONLY_TESTING #ifdef ONLY_TESTING
request_irq(IRQ_TIMER4, watchdog_fire, 0, "watchdog", NULL); ret = request_irq(IRQ_TIMER4, watchdog_fire, 0, "watchdog", NULL);
if (ret) {
*CSR_TIMER4_CNTL = 0;
clear_bit(1, &timer_alive);
}
#else #else
/*
* Setting this bit is irreversible; once enabled, there is
* no way to disable the watchdog.
*/
*CSR_SA110_CNTL |= 1 << 13; *CSR_SA110_CNTL |= 1 << 13;
MOD_INC_USE_COUNT;
ret = 0;
#endif #endif
timer_alive = 1; return ret;
return 0;
} }
/*
* Shut off the timer.
* Note: if we really have enabled the watchdog, there
* is no way to turn off.
*/
static int watchdog_release(struct inode *inode, struct file *file) static int watchdog_release(struct inode *inode, struct file *file)
{ {
#ifdef ONLY_TESTING #ifdef ONLY_TESTING
free_irq(IRQ_TIMER4, NULL); free_irq(IRQ_TIMER4, NULL);
timer_alive = 0; clear_bit(1, &timer_alive);
#else
/*
* It's irreversible!
*/
#endif #endif
return 0; return 0;
} }
static ssize_t watchdog_write(struct file *file, const char *data, size_t len, loff_t *ppos) static ssize_t
watchdog_write(struct file *file, const char *data, size_t len, loff_t *ppos)
{ {
/* Can't seek (pwrite) on this device */ /* Can't seek (pwrite) on this device */
if (ppos != &file->f_pos) if (ppos != &file->f_pos)
return -ESPIPE; return -ESPIPE;
/* /*
* Refresh the timer. * Refresh the timer.
*/ */
if(len) if (len)
{
watchdog_ping(); watchdog_ping();
return 1;
} return len;
return 0;
} }
static int watchdog_ioctl(struct inode *inode, struct file *file, static struct watchdog_info ident = {
unsigned int cmd, unsigned long arg) .options = WDIOF_SETTIMEOUT,
.identity = "Footbridge Watchdog"
};
static int
watchdog_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
unsigned long arg)
{ {
int i, new_margin; unsigned int new_margin;
static struct watchdog_info ident= int ret = -ENOIOCTLCMD;
{
WDIOF_SETTIMEOUT, switch(cmd) {
0, case WDIOC_GETSUPPORT:
"Footbridge Watchdog" ret = 0;
}; if (copy_to_user((void *)arg, &ident, sizeof(ident)))
switch(cmd) ret = -EFAULT;
{ break;
default:
return -ENOTTY; case WDIOC_GETSTATUS:
case WDIOC_GETSUPPORT: case WDIOC_GETBOOTSTATUS:
if(copy_to_user((struct watchdog_info *)arg, &ident, sizeof(ident))) ret = put_user(0,(int *)arg);
return -EFAULT; break;
return 0;
case WDIOC_GETSTATUS: case WDIOC_KEEPALIVE:
case WDIOC_GETBOOTSTATUS: watchdog_ping();
return put_user(0,(int *)arg); ret = 0;
case WDIOC_KEEPALIVE: break;
watchdog_ping();
return 0; case WDIOC_SETTIMEOUT:
case WDIOC_SETTIMEOUT: ret = get_user(new_margin, (int *)arg);
if (get_user(new_margin, (int *)arg)) if (ret)
return -EFAULT; break;
/* Arbitrary, can't find the card's limits */
if ((new_marg < 0) || (new_margin > 60)) /* Arbitrary, can't find the card's limits */
return -EINVAL; if (new_margin < 0 || new_margin > 60) {
soft_margin = new_margin; ret = -EINVAL;
watchdog_ping(); break;
/* Fall */ }
case WDIOC_GETTIMEOUT:
return put_user(soft_margin, (int *)arg); soft_margin = new_margin;
reload = soft_margin * (mem_fclk_21285 / 256);
watchdog_ping();
/* Fall */
case WDIOC_GETTIMEOUT:
ret = put_user(soft_margin, (int *)arg);
break;
} }
return ret;
} }
static struct file_operations watchdog_fops= static struct file_operations watchdog_fops = {
{
.owner = THIS_MODULE, .owner = THIS_MODULE,
.write = watchdog_write, .write = watchdog_write,
.ioctl = watchdog_ioctl, .ioctl = watchdog_ioctl,
...@@ -167,11 +188,10 @@ static struct file_operations watchdog_fops= ...@@ -167,11 +188,10 @@ static struct file_operations watchdog_fops=
.release = watchdog_release, .release = watchdog_release,
}; };
static struct miscdevice watchdog_miscdev= static struct miscdevice watchdog_miscdev = {
{ .minor = WATCHDOG_MINOR,
WATCHDOG_MINOR, .name = "watchdog",
"watchdog", .fops = &watchdog_fops
&watchdog_fops
}; };
static int __init footbridge_watchdog_init(void) static int __init footbridge_watchdog_init(void)
...@@ -182,11 +202,12 @@ static int __init footbridge_watchdog_init(void) ...@@ -182,11 +202,12 @@ static int __init footbridge_watchdog_init(void)
return -ENODEV; return -ENODEV;
retval = misc_register(&watchdog_miscdev); retval = misc_register(&watchdog_miscdev);
if(retval < 0) if (retval < 0)
return retval; return retval;
printk("Footbridge Watchdog Timer: 0.01, timer margin: %d sec\n", printk("Footbridge Watchdog Timer: 0.01, timer margin: %d sec\n",
soft_margin); soft_margin);
if (machine_is_cats()) if (machine_is_cats())
printk("Warning: Watchdog reset may not work on this machine.\n"); printk("Warning: Watchdog reset may not work on this machine.\n");
return 0; return 0;
...@@ -198,7 +219,7 @@ static void __exit footbridge_watchdog_exit(void) ...@@ -198,7 +219,7 @@ static void __exit footbridge_watchdog_exit(void)
} }
MODULE_AUTHOR("Phil Blundell <pb@nexus.co.uk>"); MODULE_AUTHOR("Phil Blundell <pb@nexus.co.uk>");
MODULE_DESCRIPTION("21285 watchdog driver"); MODULE_DESCRIPTION("Footbridge watchdog driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_PARM(soft_margin,"i"); MODULE_PARM(soft_margin,"i");
......
...@@ -58,7 +58,7 @@ MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CON ...@@ -58,7 +58,7 @@ MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default=CON
/* This is kicking the watchdog by simply re-writing the timeout to reg. 0xF2 */ /* This is kicking the watchdog by simply re-writing the timeout to reg. 0xF2 */
int kick_wdog(void) static int kick_wdog(void)
{ {
/* /*
* Refresh the timer. * Refresh the timer.
...@@ -216,21 +216,20 @@ static int wdt977_release(struct inode *inode, struct file *file) ...@@ -216,21 +216,20 @@ static int wdt977_release(struct inode *inode, struct file *file)
static ssize_t wdt977_write(struct file *file, const char *buf, size_t count, loff_t *ppos) static ssize_t wdt977_write(struct file *file, const char *buf, size_t count, loff_t *ppos)
{ {
/* Can't seek (pwrite) on this device */ /* Can't seek (pwrite) on this device */
if (ppos != &file->f_pos) if (ppos != &file->f_pos)
return -ESPIPE; return -ESPIPE;
if(count) if (count) {
{
if (!nowayout) { if (!nowayout) {
size_t i; size_t i;
/* In case it was set long ago */ /* In case it was set long ago */
expect_close = 0; expect_close = 0;
for (i = 0; i != len; i++) { for (i = 0; i != count; i++) {
char c; char c;
if (get_user(c, data + i)) if (get_user(c, buf + i))
return -EFAULT; return -EFAULT;
if (c == 'V') if (c == 'V')
expect_close = 1; expect_close = 1;
...@@ -238,9 +237,8 @@ static ssize_t wdt977_write(struct file *file, const char *buf, size_t count, lo ...@@ -238,9 +237,8 @@ static ssize_t wdt977_write(struct file *file, const char *buf, size_t count, lo
} }
kick_wdog(); kick_wdog();
return 1;
} }
return 0; return count;
} }
/* /*
...@@ -254,14 +252,15 @@ static ssize_t wdt977_write(struct file *file, const char *buf, size_t count, lo ...@@ -254,14 +252,15 @@ static ssize_t wdt977_write(struct file *file, const char *buf, size_t count, lo
* according to their available features. * according to their available features.
*/ */
static int wdt977_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg)
{
static struct watchdog_info ident = { static struct watchdog_info ident = {
.identity = "Winbond 83977" .options = WDIOF_SETTIMEOUT,
.identity = "Winbond 83977"
}; };
int temp; static int wdt977_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg)
{
int temp;
switch(cmd) switch(cmd)
{ {
...@@ -337,9 +336,9 @@ static struct file_operations wdt977_fops= ...@@ -337,9 +336,9 @@ static struct file_operations wdt977_fops=
static struct miscdevice wdt977_miscdev= static struct miscdevice wdt977_miscdev=
{ {
WATCHDOG_MINOR, .minor = WATCHDOG_MINOR,
"watchdog", .name = "watchdog",
&wdt977_fops .fops = &wdt977_fops
}; };
static int __init nwwatchdog_init(void) static int __init nwwatchdog_init(void)
...@@ -360,4 +359,5 @@ static void __exit nwwatchdog_exit(void) ...@@ -360,4 +359,5 @@ static void __exit nwwatchdog_exit(void)
module_init(nwwatchdog_init); module_init(nwwatchdog_init);
module_exit(nwwatchdog_exit); module_exit(nwwatchdog_exit);
MODULE_DESCRIPTION("W83977AF Watchdog driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
*/ */
#include <linux/module.h> #include <linux/module.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/input.h>
#include <linux/serio.h> #include <linux/serio.h>
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
...@@ -339,6 +340,7 @@ static struct sa1111_driver ps2_driver = { ...@@ -339,6 +340,7 @@ static struct sa1111_driver ps2_driver = {
.drv = { .drv = {
.name = "sa1111-ps2", .name = "sa1111-ps2",
.bus = &sa1111_bus_type, .bus = &sa1111_bus_type,
.devclass = &input_devclass,
.probe = ps2_probe, .probe = ps2_probe,
.remove = ps2_remove, .remove = ps2_remove,
.suspend = ps2_suspend, .suspend = ps2_suspend,
......
...@@ -773,14 +773,15 @@ static struct mtd_partition stork_partitions[] = { ...@@ -773,14 +773,15 @@ static struct mtd_partition stork_partitions[] = {
#ifdef CONFIG_SA1100_TRIZEPS #ifdef CONFIG_SA1100_TRIZEPS
static struct mtd_partition trizeps_partitions[] = { static struct mtd_partition trizeps_partitions[] = {
{ {
.name = "Bootloader & the kernel", .name = "Bootloader",
.size = 0x00200000, .size = 0x00100000,
.offset = 0, .offset = 0,
}, { }, {
.name = "Data", .name = "Kernel",
.size = 0x00400000, .size = 0x00100000,
.offset = MTDPART_OFS_APPEND, .offset = MTDPART_OFS_APPEND,
}, { }, {
.name = "root",
.size = MTDPART_SIZ_FULL, .size = MTDPART_SIZ_FULL,
.offset = MTDPART_OFS_APPEND, .offset = MTDPART_OFS_APPEND,
} }
...@@ -937,7 +938,7 @@ static int __init sa1100_static_partitions(struct mtd_partition **parts) ...@@ -937,7 +938,7 @@ static int __init sa1100_static_partitions(struct mtd_partition **parts)
#ifdef CONFIG_SA1100_TRIZEPS #ifdef CONFIG_SA1100_TRIZEPS
if (machine_is_trizeps()) { if (machine_is_trizeps()) {
*parts = trizeps_partitions; *parts = trizeps_partitions;
nb_parts = ARRAY_SIZE(trizeps_parititons); nb_parts = ARRAY_SIZE(trizeps_partitions);
} }
#endif #endif
#ifdef CONFIG_SA1100_YOPY #ifdef CONFIG_SA1100_YOPY
......
...@@ -24,8 +24,8 @@ ...@@ -24,8 +24,8 @@
#define STD_SERIAL_PORT_DEFNS \ #define STD_SERIAL_PORT_DEFNS \
/* UART CLK PORT IRQ FLAGS */ \ /* UART CLK PORT IRQ FLAGS */ \
{ 0, BASE_BAUD, 0xfe810000, IRQ_UART2, STD_COM_FLAGS }, /* ttyS0 */ \ { 0, BASE_BAUD, IQ80310_UART2, IRQ_UART2, STD_COM_FLAGS }, /* ttyS0 */ \
{ 0, BASE_BAUD, 0xfe800000, IRQ_UART1, STD_COM_FLAGS } /* ttyS1 */ { 0, BASE_BAUD, IQ80310_UART1, IRQ_UART1, STD_COM_FLAGS } /* ttyS1 */
#endif // CONFIG_ARCH_IQ80310 #endif // CONFIG_ARCH_IQ80310
......
...@@ -33,9 +33,12 @@ struct irqchip { ...@@ -33,9 +33,12 @@ struct irqchip {
*/ */
void (*unmask)(unsigned int); void (*unmask)(unsigned int);
/* /*
* Re-run the IRQ * Ask the hardware to re-trigger the IRQ.
* Note: This method _must_ _not_ call the interrupt handler.
* If you are unable to retrigger the interrupt, do not
* provide a function, or if you do, return non-zero.
*/ */
void (*rerun)(unsigned int); int (*retrigger)(unsigned int);
/* /*
* Set the type of the IRQ. * Set the type of the IRQ.
*/ */
...@@ -50,6 +53,7 @@ struct irqdesc { ...@@ -50,6 +53,7 @@ struct irqdesc {
irq_handler_t handle; irq_handler_t handle;
struct irqchip *chip; struct irqchip *chip;
struct irqaction *action; struct irqaction *action;
struct list_head pend;
unsigned int disable_depth; unsigned int disable_depth;
unsigned int triggered: 1; /* IRQ has occurred */ unsigned int triggered: 1; /* IRQ has occurred */
......
...@@ -23,7 +23,7 @@ ...@@ -23,7 +23,7 @@
#define KERNEL_STACK_SIZE PAGE_SIZE #define KERNEL_STACK_SIZE PAGE_SIZE
#define INIT_EXTRA_THREAD_INFO \ #define INIT_EXTRA_THREAD_INFO \
.cpu_domain = domain_val(DOMAIN_USER, DOMAIN_CLIENT) | \ .cpu_domain = domain_val(DOMAIN_USER, DOMAIN_MANAGER) | \
domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | \ domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | \
domain_val(DOMAIN_IO, DOMAIN_CLIENT) domain_val(DOMAIN_IO, DOMAIN_CLIENT)
......
...@@ -14,9 +14,14 @@ ...@@ -14,9 +14,14 @@
#define set_cr(x) \ #define set_cr(x) \
__asm__ __volatile__( \ __asm__ __volatile__( \
"mcr p15, 0, %0, c1, c0 @ set CR" \ "mcr p15, 0, %0, c1, c0, 0 @ set CR" \
: : "r" (x)) : : "r" (x))
#define get_cr(x) \
__asm__ __volatile__( \
"mrc p15, 0, %0, c1, c0, 0 @ get CR" \
: "=r" (x))
#define CR_M (1 << 0) /* MMU enable */ #define CR_M (1 << 0) /* MMU enable */
#define CR_A (1 << 1) /* Alignment abort enable */ #define CR_A (1 << 1) /* Alignment abort enable */
#define CR_C (1 << 2) /* Dcache enable */ #define CR_C (1 << 2) /* Dcache enable */
...@@ -24,9 +29,9 @@ ...@@ -24,9 +29,9 @@
#define CR_P (1 << 4) /* 32-bit exception handler */ #define CR_P (1 << 4) /* 32-bit exception handler */
#define CR_D (1 << 5) /* 32-bit data address range */ #define CR_D (1 << 5) /* 32-bit data address range */
#define CR_L (1 << 6) /* Implementation defined */ #define CR_L (1 << 6) /* Implementation defined */
#define CD_B (1 << 7) /* Big endian */ #define CR_B (1 << 7) /* Big endian */
#define CR_S (1 << 8) /* System MMU protection */ #define CR_S (1 << 8) /* System MMU protection */
#define CD_R (1 << 9) /* ROM MMU protection */ #define CR_R (1 << 9) /* ROM MMU protection */
#define CR_F (1 << 10) /* Implementation defined */ #define CR_F (1 << 10) /* Implementation defined */
#define CR_Z (1 << 11) /* Implementation defined */ #define CR_Z (1 << 11) /* Implementation defined */
#define CR_I (1 << 12) /* Icache enable */ #define CR_I (1 << 12) /* Icache enable */
......
...@@ -184,9 +184,7 @@ typedef struct sigaltstack { ...@@ -184,9 +184,7 @@ typedef struct sigaltstack {
#ifdef __KERNEL__ #ifdef __KERNEL__
#include <asm/sigcontext.h> #include <asm/sigcontext.h>
#define ptrace_signal_deliver(regs, cookie) do { } while (0)
#define HAVE_ARCH_GET_SIGNAL_TO_DELIVER
#endif #endif
#endif #endif
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment