mirror of https://gitee.com/openkylin/linux.git
Auto-update from upstream
This commit is contained in:
commit
e0f998930e
|
@ -17,7 +17,7 @@ are specified on the kernel command line with the module name plus
|
||||||
|
|
||||||
usbcore.blinkenlights=1
|
usbcore.blinkenlights=1
|
||||||
|
|
||||||
The text in square brackets at the beginning of the description state the
|
The text in square brackets at the beginning of the description states the
|
||||||
restrictions on the kernel for the said kernel parameter to be valid. The
|
restrictions on the kernel for the said kernel parameter to be valid. The
|
||||||
restrictions referred to are that the relevant option is valid if:
|
restrictions referred to are that the relevant option is valid if:
|
||||||
|
|
||||||
|
@ -27,8 +27,8 @@ restrictions referred to are that the relevant option is valid if:
|
||||||
APM Advanced Power Management support is enabled.
|
APM Advanced Power Management support is enabled.
|
||||||
AX25 Appropriate AX.25 support is enabled.
|
AX25 Appropriate AX.25 support is enabled.
|
||||||
CD Appropriate CD support is enabled.
|
CD Appropriate CD support is enabled.
|
||||||
DEVFS devfs support is enabled.
|
DEVFS devfs support is enabled.
|
||||||
DRM Direct Rendering Management support is enabled.
|
DRM Direct Rendering Management support is enabled.
|
||||||
EDD BIOS Enhanced Disk Drive Services (EDD) is enabled
|
EDD BIOS Enhanced Disk Drive Services (EDD) is enabled
|
||||||
EFI EFI Partitioning (GPT) is enabled
|
EFI EFI Partitioning (GPT) is enabled
|
||||||
EIDE EIDE/ATAPI support is enabled.
|
EIDE EIDE/ATAPI support is enabled.
|
||||||
|
@ -71,7 +71,7 @@ restrictions referred to are that the relevant option is valid if:
|
||||||
SERIAL Serial support is enabled.
|
SERIAL Serial support is enabled.
|
||||||
SMP The kernel is an SMP kernel.
|
SMP The kernel is an SMP kernel.
|
||||||
SPARC Sparc architecture is enabled.
|
SPARC Sparc architecture is enabled.
|
||||||
SWSUSP Software suspension is enabled.
|
SWSUSP Software suspend is enabled.
|
||||||
TS Appropriate touchscreen support is enabled.
|
TS Appropriate touchscreen support is enabled.
|
||||||
USB USB support is enabled.
|
USB USB support is enabled.
|
||||||
USBHID USB Human Interface Device support is enabled.
|
USBHID USB Human Interface Device support is enabled.
|
||||||
|
@ -105,13 +105,13 @@ running once the system is up.
|
||||||
See header of drivers/scsi/53c7xx.c.
|
See header of drivers/scsi/53c7xx.c.
|
||||||
See also Documentation/scsi/ncr53c7xx.txt.
|
See also Documentation/scsi/ncr53c7xx.txt.
|
||||||
|
|
||||||
acpi= [HW,ACPI] Advanced Configuration and Power Interface
|
acpi= [HW,ACPI] Advanced Configuration and Power Interface
|
||||||
Format: { force | off | ht | strict }
|
Format: { force | off | ht | strict | noirq }
|
||||||
force -- enable ACPI if default was off
|
force -- enable ACPI if default was off
|
||||||
off -- disable ACPI if default was on
|
off -- disable ACPI if default was on
|
||||||
noirq -- do not use ACPI for IRQ routing
|
noirq -- do not use ACPI for IRQ routing
|
||||||
ht -- run only enough ACPI to enable Hyper Threading
|
ht -- run only enough ACPI to enable Hyper Threading
|
||||||
strict -- Be less tolerant of platforms that are not
|
strict -- Be less tolerant of platforms that are not
|
||||||
strictly ACPI specification compliant.
|
strictly ACPI specification compliant.
|
||||||
|
|
||||||
See also Documentation/pm.txt, pci=noacpi
|
See also Documentation/pm.txt, pci=noacpi
|
||||||
|
@ -119,20 +119,23 @@ running once the system is up.
|
||||||
acpi_sleep= [HW,ACPI] Sleep options
|
acpi_sleep= [HW,ACPI] Sleep options
|
||||||
Format: { s3_bios, s3_mode }
|
Format: { s3_bios, s3_mode }
|
||||||
See Documentation/power/video.txt
|
See Documentation/power/video.txt
|
||||||
|
|
||||||
acpi_sci= [HW,ACPI] ACPI System Control Interrupt trigger mode
|
acpi_sci= [HW,ACPI] ACPI System Control Interrupt trigger mode
|
||||||
Format: { level | edge | high | low }
|
Format: { level | edge | high | low }
|
||||||
|
|
||||||
acpi_irq_balance [HW,ACPI] ACPI will balance active IRQs
|
acpi_irq_balance [HW,ACPI]
|
||||||
default in APIC mode
|
ACPI will balance active IRQs
|
||||||
|
default in APIC mode
|
||||||
|
|
||||||
acpi_irq_nobalance [HW,ACPI] ACPI will not move active IRQs (default)
|
acpi_irq_nobalance [HW,ACPI]
|
||||||
default in PIC mode
|
ACPI will not move active IRQs (default)
|
||||||
|
default in PIC mode
|
||||||
|
|
||||||
acpi_irq_pci= [HW,ACPI] If irq_balance, Clear listed IRQs for use by PCI
|
acpi_irq_pci= [HW,ACPI] If irq_balance, clear listed IRQs for
|
||||||
|
use by PCI
|
||||||
Format: <irq>,<irq>...
|
Format: <irq>,<irq>...
|
||||||
|
|
||||||
acpi_irq_isa= [HW,ACPI] If irq_balance, Mark listed IRQs used by ISA
|
acpi_irq_isa= [HW,ACPI] If irq_balance, mark listed IRQs used by ISA
|
||||||
Format: <irq>,<irq>...
|
Format: <irq>,<irq>...
|
||||||
|
|
||||||
acpi_osi= [HW,ACPI] empty param disables _OSI
|
acpi_osi= [HW,ACPI] empty param disables _OSI
|
||||||
|
@ -145,14 +148,14 @@ running once the system is up.
|
||||||
|
|
||||||
acpi_dbg_layer= [HW,ACPI]
|
acpi_dbg_layer= [HW,ACPI]
|
||||||
Format: <int>
|
Format: <int>
|
||||||
Each bit of the <int> indicates an acpi debug layer,
|
Each bit of the <int> indicates an ACPI debug layer,
|
||||||
1: enable, 0: disable. It is useful for boot time
|
1: enable, 0: disable. It is useful for boot time
|
||||||
debugging. After system has booted up, it can be set
|
debugging. After system has booted up, it can be set
|
||||||
via /proc/acpi/debug_layer.
|
via /proc/acpi/debug_layer.
|
||||||
|
|
||||||
acpi_dbg_level= [HW,ACPI]
|
acpi_dbg_level= [HW,ACPI]
|
||||||
Format: <int>
|
Format: <int>
|
||||||
Each bit of the <int> indicates an acpi debug level,
|
Each bit of the <int> indicates an ACPI debug level,
|
||||||
1: enable, 0: disable. It is useful for boot time
|
1: enable, 0: disable. It is useful for boot time
|
||||||
debugging. After system has booted up, it can be set
|
debugging. After system has booted up, it can be set
|
||||||
via /proc/acpi/debug_level.
|
via /proc/acpi/debug_level.
|
||||||
|
@ -161,12 +164,13 @@ running once the system is up.
|
||||||
|
|
||||||
acpi_generic_hotkey [HW,ACPI]
|
acpi_generic_hotkey [HW,ACPI]
|
||||||
Allow consolidated generic hotkey driver to
|
Allow consolidated generic hotkey driver to
|
||||||
over-ride platform specific driver.
|
override platform specific driver.
|
||||||
See also Documentation/acpi-hotkey.txt.
|
See also Documentation/acpi-hotkey.txt.
|
||||||
|
|
||||||
enable_timer_pin_1 [i386,x86-64]
|
enable_timer_pin_1 [i386,x86-64]
|
||||||
Enable PIN 1 of APIC timer
|
Enable PIN 1 of APIC timer
|
||||||
Can be useful to work around chipset bugs (in particular on some ATI chipsets)
|
Can be useful to work around chipset bugs
|
||||||
|
(in particular on some ATI chipsets).
|
||||||
The kernel tries to set a reasonable default.
|
The kernel tries to set a reasonable default.
|
||||||
|
|
||||||
disable_timer_pin_1 [i386,x86-64]
|
disable_timer_pin_1 [i386,x86-64]
|
||||||
|
@ -182,7 +186,7 @@ running once the system is up.
|
||||||
|
|
||||||
adlib= [HW,OSS]
|
adlib= [HW,OSS]
|
||||||
Format: <io>
|
Format: <io>
|
||||||
|
|
||||||
advansys= [HW,SCSI]
|
advansys= [HW,SCSI]
|
||||||
See header of drivers/scsi/advansys.c.
|
See header of drivers/scsi/advansys.c.
|
||||||
|
|
||||||
|
@ -192,7 +196,7 @@ running once the system is up.
|
||||||
aedsp16= [HW,OSS] Audio Excel DSP 16
|
aedsp16= [HW,OSS] Audio Excel DSP 16
|
||||||
Format: <io>,<irq>,<dma>,<mss_io>,<mpu_io>,<mpu_irq>
|
Format: <io>,<irq>,<dma>,<mss_io>,<mpu_io>,<mpu_irq>
|
||||||
See also header of sound/oss/aedsp16.c.
|
See also header of sound/oss/aedsp16.c.
|
||||||
|
|
||||||
aha152x= [HW,SCSI]
|
aha152x= [HW,SCSI]
|
||||||
See Documentation/scsi/aha152x.txt.
|
See Documentation/scsi/aha152x.txt.
|
||||||
|
|
||||||
|
@ -205,10 +209,6 @@ running once the system is up.
|
||||||
aic79xx= [HW,SCSI]
|
aic79xx= [HW,SCSI]
|
||||||
See Documentation/scsi/aic79xx.txt.
|
See Documentation/scsi/aic79xx.txt.
|
||||||
|
|
||||||
AM53C974= [HW,SCSI]
|
|
||||||
Format: <host-scsi-id>,<target-scsi-id>,<max-rate>,<max-offset>
|
|
||||||
See also header of drivers/scsi/AM53C974.c.
|
|
||||||
|
|
||||||
amijoy.map= [HW,JOY] Amiga joystick support
|
amijoy.map= [HW,JOY] Amiga joystick support
|
||||||
Map of devices attached to JOY0DAT and JOY1DAT
|
Map of devices attached to JOY0DAT and JOY1DAT
|
||||||
Format: <a>,<b>
|
Format: <a>,<b>
|
||||||
|
@ -219,23 +219,24 @@ running once the system is up.
|
||||||
connected to one of 16 gameports
|
connected to one of 16 gameports
|
||||||
Format: <type1>,<type2>,..<type16>
|
Format: <type1>,<type2>,..<type16>
|
||||||
|
|
||||||
apc= [HW,SPARC] Power management functions (SPARCstation-4/5 + deriv.)
|
apc= [HW,SPARC]
|
||||||
|
Power management functions (SPARCstation-4/5 + deriv.)
|
||||||
Format: noidle
|
Format: noidle
|
||||||
Disable APC CPU standby support. SPARCstation-Fox does
|
Disable APC CPU standby support. SPARCstation-Fox does
|
||||||
not play well with APC CPU idle - disable it if you have
|
not play well with APC CPU idle - disable it if you have
|
||||||
APC and your system crashes randomly.
|
APC and your system crashes randomly.
|
||||||
|
|
||||||
apic= [APIC,i386] Change the output verbosity whilst booting
|
apic= [APIC,i386] Change the output verbosity whilst booting
|
||||||
Format: { quiet (default) | verbose | debug }
|
Format: { quiet (default) | verbose | debug }
|
||||||
Change the amount of debugging information output
|
Change the amount of debugging information output
|
||||||
when initialising the APIC and IO-APIC components.
|
when initialising the APIC and IO-APIC components.
|
||||||
|
|
||||||
apm= [APM] Advanced Power Management
|
apm= [APM] Advanced Power Management
|
||||||
See header of arch/i386/kernel/apm.c.
|
See header of arch/i386/kernel/apm.c.
|
||||||
|
|
||||||
applicom= [HW]
|
applicom= [HW]
|
||||||
Format: <mem>,<irq>
|
Format: <mem>,<irq>
|
||||||
|
|
||||||
arcrimi= [HW,NET] ARCnet - "RIM I" (entirely mem-mapped) cards
|
arcrimi= [HW,NET] ARCnet - "RIM I" (entirely mem-mapped) cards
|
||||||
Format: <io>,<irq>,<nodeID>
|
Format: <io>,<irq>,<nodeID>
|
||||||
|
|
||||||
|
@ -250,38 +251,40 @@ running once the system is up.
|
||||||
|
|
||||||
atkbd.reset= [HW] Reset keyboard during initialization
|
atkbd.reset= [HW] Reset keyboard during initialization
|
||||||
|
|
||||||
atkbd.set= [HW] Select keyboard code set
|
atkbd.set= [HW] Select keyboard code set
|
||||||
Format: <int> (2 = AT (default) 3 = PS/2)
|
Format: <int> (2 = AT (default), 3 = PS/2)
|
||||||
|
|
||||||
atkbd.scroll= [HW] Enable scroll wheel on MS Office and similar
|
atkbd.scroll= [HW] Enable scroll wheel on MS Office and similar
|
||||||
keyboards
|
keyboards
|
||||||
|
|
||||||
atkbd.softraw= [HW] Choose between synthetic and real raw mode
|
atkbd.softraw= [HW] Choose between synthetic and real raw mode
|
||||||
Format: <bool> (0 = real, 1 = synthetic (default))
|
Format: <bool> (0 = real, 1 = synthetic (default))
|
||||||
|
|
||||||
atkbd.softrepeat=
|
atkbd.softrepeat= [HW]
|
||||||
[HW] Use software keyboard repeat
|
Use software keyboard repeat
|
||||||
|
|
||||||
autotest [IA64]
|
autotest [IA64]
|
||||||
|
|
||||||
awe= [HW,OSS] AWE32/SB32/AWE64 wave table synth
|
awe= [HW,OSS] AWE32/SB32/AWE64 wave table synth
|
||||||
Format: <io>,<memsize>,<isapnp>
|
Format: <io>,<memsize>,<isapnp>
|
||||||
|
|
||||||
aztcd= [HW,CD] Aztech CD268 CDROM driver
|
aztcd= [HW,CD] Aztech CD268 CDROM driver
|
||||||
Format: <io>,0x79 (?)
|
Format: <io>,0x79 (?)
|
||||||
|
|
||||||
baycom_epp= [HW,AX25]
|
baycom_epp= [HW,AX25]
|
||||||
Format: <io>,<mode>
|
Format: <io>,<mode>
|
||||||
|
|
||||||
baycom_par= [HW,AX25] BayCom Parallel Port AX.25 Modem
|
baycom_par= [HW,AX25] BayCom Parallel Port AX.25 Modem
|
||||||
Format: <io>,<mode>
|
Format: <io>,<mode>
|
||||||
See header of drivers/net/hamradio/baycom_par.c.
|
See header of drivers/net/hamradio/baycom_par.c.
|
||||||
|
|
||||||
baycom_ser_fdx= [HW,AX25] BayCom Serial Port AX.25 Modem (Full Duplex Mode)
|
baycom_ser_fdx= [HW,AX25]
|
||||||
|
BayCom Serial Port AX.25 Modem (Full Duplex Mode)
|
||||||
Format: <io>,<irq>,<mode>[,<baud>]
|
Format: <io>,<irq>,<mode>[,<baud>]
|
||||||
See header of drivers/net/hamradio/baycom_ser_fdx.c.
|
See header of drivers/net/hamradio/baycom_ser_fdx.c.
|
||||||
|
|
||||||
baycom_ser_hdx= [HW,AX25] BayCom Serial Port AX.25 Modem (Half Duplex Mode)
|
baycom_ser_hdx= [HW,AX25]
|
||||||
|
BayCom Serial Port AX.25 Modem (Half Duplex Mode)
|
||||||
Format: <io>,<irq>,<mode>
|
Format: <io>,<irq>,<mode>
|
||||||
See header of drivers/net/hamradio/baycom_ser_hdx.c.
|
See header of drivers/net/hamradio/baycom_ser_hdx.c.
|
||||||
|
|
||||||
|
@ -292,7 +295,8 @@ running once the system is up.
|
||||||
blkmtd_count=
|
blkmtd_count=
|
||||||
|
|
||||||
bttv.card= [HW,V4L] bttv (bt848 + bt878 based grabber cards)
|
bttv.card= [HW,V4L] bttv (bt848 + bt878 based grabber cards)
|
||||||
bttv.radio= Most important insmod options are available as kernel args too.
|
bttv.radio= Most important insmod options are available as
|
||||||
|
kernel args too.
|
||||||
bttv.pll= See Documentation/video4linux/bttv/Insmod-options
|
bttv.pll= See Documentation/video4linux/bttv/Insmod-options
|
||||||
bttv.tuner= and Documentation/video4linux/bttv/CARDLIST
|
bttv.tuner= and Documentation/video4linux/bttv/CARDLIST
|
||||||
|
|
||||||
|
@ -318,15 +322,17 @@ running once the system is up.
|
||||||
checkreqprot [SELINUX] Set initial checkreqprot flag value.
|
checkreqprot [SELINUX] Set initial checkreqprot flag value.
|
||||||
Format: { "0" | "1" }
|
Format: { "0" | "1" }
|
||||||
See security/selinux/Kconfig help text.
|
See security/selinux/Kconfig help text.
|
||||||
0 -- check protection applied by kernel (includes any implied execute protection).
|
0 -- check protection applied by kernel (includes
|
||||||
|
any implied execute protection).
|
||||||
1 -- check protection requested by application.
|
1 -- check protection requested by application.
|
||||||
Default value is set via a kernel config option.
|
Default value is set via a kernel config option.
|
||||||
Value can be changed at runtime via /selinux/checkreqprot.
|
Value can be changed at runtime via
|
||||||
|
/selinux/checkreqprot.
|
||||||
clock= [BUGS=IA-32, HW] gettimeofday timesource override.
|
|
||||||
|
clock= [BUGS=IA-32,HW] gettimeofday timesource override.
|
||||||
Forces specified timesource (if avaliable) to be used
|
Forces specified timesource (if avaliable) to be used
|
||||||
when calculating gettimeofday(). If specicified timesource
|
when calculating gettimeofday(). If specicified
|
||||||
is not avalible, it defaults to PIT.
|
timesource is not avalible, it defaults to PIT.
|
||||||
Format: { pit | tsc | cyclone | pmtmr }
|
Format: { pit | tsc | cyclone | pmtmr }
|
||||||
|
|
||||||
hpet= [IA-32,HPET] option to disable HPET and use PIT.
|
hpet= [IA-32,HPET] option to disable HPET and use PIT.
|
||||||
|
@ -336,17 +342,19 @@ running once the system is up.
|
||||||
Format: { auto | [<io>,][<irq>] }
|
Format: { auto | [<io>,][<irq>] }
|
||||||
|
|
||||||
com20020= [HW,NET] ARCnet - COM20020 chipset
|
com20020= [HW,NET] ARCnet - COM20020 chipset
|
||||||
Format: <io>[,<irq>[,<nodeID>[,<backplane>[,<ckp>[,<timeout>]]]]]
|
Format:
|
||||||
|
<io>[,<irq>[,<nodeID>[,<backplane>[,<ckp>[,<timeout>]]]]]
|
||||||
|
|
||||||
com90io= [HW,NET] ARCnet - COM90xx chipset (IO-mapped buffers)
|
com90io= [HW,NET] ARCnet - COM90xx chipset (IO-mapped buffers)
|
||||||
Format: <io>[,<irq>]
|
Format: <io>[,<irq>]
|
||||||
|
|
||||||
com90xx= [HW,NET] ARCnet - COM90xx chipset (memory-mapped buffers)
|
com90xx= [HW,NET]
|
||||||
|
ARCnet - COM90xx chipset (memory-mapped buffers)
|
||||||
Format: <io>[,<irq>[,<memstart>]]
|
Format: <io>[,<irq>[,<memstart>]]
|
||||||
|
|
||||||
condev= [HW,S390] console device
|
condev= [HW,S390] console device
|
||||||
conmode=
|
conmode=
|
||||||
|
|
||||||
console= [KNL] Output console device and options.
|
console= [KNL] Output console device and options.
|
||||||
|
|
||||||
tty<n> Use the virtual console device <n>.
|
tty<n> Use the virtual console device <n>.
|
||||||
|
@ -367,7 +375,8 @@ running once the system is up.
|
||||||
options are the same as for ttyS, above.
|
options are the same as for ttyS, above.
|
||||||
|
|
||||||
cpcihp_generic= [HW,PCI] Generic port I/O CompactPCI driver
|
cpcihp_generic= [HW,PCI] Generic port I/O CompactPCI driver
|
||||||
Format: <first_slot>,<last_slot>,<port>,<enum_bit>[,<debug>]
|
Format:
|
||||||
|
<first_slot>,<last_slot>,<port>,<enum_bit>[,<debug>]
|
||||||
|
|
||||||
cpia_pp= [HW,PPT]
|
cpia_pp= [HW,PPT]
|
||||||
Format: { parport<nr> | auto | none }
|
Format: { parport<nr> | auto | none }
|
||||||
|
@ -384,10 +393,10 @@ running once the system is up.
|
||||||
|
|
||||||
cs89x0_media= [HW,NET]
|
cs89x0_media= [HW,NET]
|
||||||
Format: { rj45 | aui | bnc }
|
Format: { rj45 | aui | bnc }
|
||||||
|
|
||||||
cyclades= [HW,SERIAL] Cyclades multi-serial port adapter.
|
cyclades= [HW,SERIAL] Cyclades multi-serial port adapter.
|
||||||
|
|
||||||
dasd= [HW,NET]
|
dasd= [HW,NET]
|
||||||
See header of drivers/s390/block/dasd_devmap.c.
|
See header of drivers/s390/block/dasd_devmap.c.
|
||||||
|
|
||||||
db9.dev[2|3]= [HW,JOY] Multisystem joystick support via parallel port
|
db9.dev[2|3]= [HW,JOY] Multisystem joystick support via parallel port
|
||||||
|
@ -406,7 +415,7 @@ running once the system is up.
|
||||||
|
|
||||||
dhash_entries= [KNL]
|
dhash_entries= [KNL]
|
||||||
Set number of hash buckets for dentry cache.
|
Set number of hash buckets for dentry cache.
|
||||||
|
|
||||||
digi= [HW,SERIAL]
|
digi= [HW,SERIAL]
|
||||||
IO parameters + enable/disable command.
|
IO parameters + enable/disable command.
|
||||||
|
|
||||||
|
@ -424,11 +433,11 @@ running once the system is up.
|
||||||
|
|
||||||
dtc3181e= [HW,SCSI]
|
dtc3181e= [HW,SCSI]
|
||||||
|
|
||||||
earlyprintk= [IA-32, X86-64]
|
earlyprintk= [IA-32,X86-64]
|
||||||
earlyprintk=vga
|
earlyprintk=vga
|
||||||
earlyprintk=serial[,ttySn[,baudrate]]
|
earlyprintk=serial[,ttySn[,baudrate]]
|
||||||
|
|
||||||
Append ,keep to not disable it when the real console
|
Append ",keep" to not disable it when the real console
|
||||||
takes over.
|
takes over.
|
||||||
|
|
||||||
Only vga or serial at a time, not both.
|
Only vga or serial at a time, not both.
|
||||||
|
@ -451,7 +460,7 @@ running once the system is up.
|
||||||
Format: {"of[f]" | "sk[ipmbr]"}
|
Format: {"of[f]" | "sk[ipmbr]"}
|
||||||
See comment in arch/i386/boot/edd.S
|
See comment in arch/i386/boot/edd.S
|
||||||
|
|
||||||
eicon= [HW,ISDN]
|
eicon= [HW,ISDN]
|
||||||
Format: <id>,<membase>,<irq>
|
Format: <id>,<membase>,<irq>
|
||||||
|
|
||||||
eisa_irq_edge= [PARISC,HW]
|
eisa_irq_edge= [PARISC,HW]
|
||||||
|
@ -462,12 +471,13 @@ running once the system is up.
|
||||||
arch/i386/kernel/cpu/cpufreq/elanfreq.c.
|
arch/i386/kernel/cpu/cpufreq/elanfreq.c.
|
||||||
|
|
||||||
elevator= [IOSCHED]
|
elevator= [IOSCHED]
|
||||||
Format: {"as"|"cfq"|"deadline"|"noop"}
|
Format: {"as" | "cfq" | "deadline" | "noop"}
|
||||||
See Documentation/block/as-iosched.txt
|
See Documentation/block/as-iosched.txt and
|
||||||
and Documentation/block/deadline-iosched.txt for details.
|
Documentation/block/deadline-iosched.txt for details.
|
||||||
|
|
||||||
elfcorehdr= [IA-32]
|
elfcorehdr= [IA-32]
|
||||||
Specifies physical address of start of kernel core image
|
Specifies physical address of start of kernel core
|
||||||
elf header.
|
image elf header.
|
||||||
See Documentation/kdump.txt for details.
|
See Documentation/kdump.txt for details.
|
||||||
|
|
||||||
enforcing [SELINUX] Set initial enforcing status.
|
enforcing [SELINUX] Set initial enforcing status.
|
||||||
|
@ -485,7 +495,7 @@ running once the system is up.
|
||||||
es1371= [HW,OSS]
|
es1371= [HW,OSS]
|
||||||
Format: <spdif>,[<nomix>,[<amplifier>]]
|
Format: <spdif>,[<nomix>,[<amplifier>]]
|
||||||
See also header of sound/oss/es1371.c.
|
See also header of sound/oss/es1371.c.
|
||||||
|
|
||||||
ether= [HW,NET] Ethernet cards parameters
|
ether= [HW,NET] Ethernet cards parameters
|
||||||
This option is obsoleted by the "netdev=" option, which
|
This option is obsoleted by the "netdev=" option, which
|
||||||
has equivalent usage. See its documentation for details.
|
has equivalent usage. See its documentation for details.
|
||||||
|
@ -526,12 +536,13 @@ running once the system is up.
|
||||||
|
|
||||||
gus= [HW,OSS]
|
gus= [HW,OSS]
|
||||||
Format: <io>,<irq>,<dma>,<dma16>
|
Format: <io>,<irq>,<dma>,<dma16>
|
||||||
|
|
||||||
gvp11= [HW,SCSI]
|
gvp11= [HW,SCSI]
|
||||||
|
|
||||||
hashdist= [KNL,NUMA] Large hashes allocated during boot
|
hashdist= [KNL,NUMA] Large hashes allocated during boot
|
||||||
are distributed across NUMA nodes. Defaults on
|
are distributed across NUMA nodes. Defaults on
|
||||||
for IA-64, off otherwise.
|
for IA-64, off otherwise.
|
||||||
|
Format: 0 | 1 (for off | on)
|
||||||
|
|
||||||
hcl= [IA-64] SGI's Hardware Graph compatibility layer
|
hcl= [IA-64] SGI's Hardware Graph compatibility layer
|
||||||
|
|
||||||
|
@ -595,13 +606,13 @@ running once the system is up.
|
||||||
ide?= [HW] (E)IDE subsystem
|
ide?= [HW] (E)IDE subsystem
|
||||||
Format: ide?=noprobe or chipset specific parameters.
|
Format: ide?=noprobe or chipset specific parameters.
|
||||||
See Documentation/ide.txt.
|
See Documentation/ide.txt.
|
||||||
|
|
||||||
idebus= [HW] (E)IDE subsystem - VLB/PCI bus speed
|
idebus= [HW] (E)IDE subsystem - VLB/PCI bus speed
|
||||||
See Documentation/ide.txt.
|
See Documentation/ide.txt.
|
||||||
|
|
||||||
idle= [HW]
|
idle= [HW]
|
||||||
Format: idle=poll or idle=halt
|
Format: idle=poll or idle=halt
|
||||||
|
|
||||||
ihash_entries= [KNL]
|
ihash_entries= [KNL]
|
||||||
Set number of hash buckets for inode cache.
|
Set number of hash buckets for inode cache.
|
||||||
|
|
||||||
|
@ -649,7 +660,7 @@ running once the system is up.
|
||||||
firmware running.
|
firmware running.
|
||||||
|
|
||||||
isapnp= [ISAPNP]
|
isapnp= [ISAPNP]
|
||||||
Format: <RDP>, <reset>, <pci_scan>, <verbosity>
|
Format: <RDP>,<reset>,<pci_scan>,<verbosity>
|
||||||
|
|
||||||
isolcpus= [KNL,SMP] Isolate CPUs from the general scheduler.
|
isolcpus= [KNL,SMP] Isolate CPUs from the general scheduler.
|
||||||
Format: <cpu number>,...,<cpu number>
|
Format: <cpu number>,...,<cpu number>
|
||||||
|
@ -661,32 +672,33 @@ running once the system is up.
|
||||||
"number of CPUs in system - 1".
|
"number of CPUs in system - 1".
|
||||||
|
|
||||||
This option is the preferred way to isolate CPUs. The
|
This option is the preferred way to isolate CPUs. The
|
||||||
alternative - manually setting the CPU mask of all tasks
|
alternative -- manually setting the CPU mask of all
|
||||||
in the system can cause problems and suboptimal load
|
tasks in the system -- can cause problems and
|
||||||
balancer performance.
|
suboptimal load balancer performance.
|
||||||
|
|
||||||
isp16= [HW,CD]
|
isp16= [HW,CD]
|
||||||
Format: <io>,<irq>,<dma>,<setup>
|
Format: <io>,<irq>,<dma>,<setup>
|
||||||
|
|
||||||
iucv= [HW,NET]
|
iucv= [HW,NET]
|
||||||
|
|
||||||
js= [HW,JOY] Analog joystick
|
js= [HW,JOY] Analog joystick
|
||||||
See Documentation/input/joystick.txt.
|
See Documentation/input/joystick.txt.
|
||||||
|
|
||||||
keepinitrd [HW,ARM]
|
keepinitrd [HW,ARM]
|
||||||
|
|
||||||
kstack=N [IA-32, X86-64] Print N words from the kernel stack
|
kstack=N [IA-32,X86-64] Print N words from the kernel stack
|
||||||
in oops dumps.
|
in oops dumps.
|
||||||
|
|
||||||
l2cr= [PPC]
|
l2cr= [PPC]
|
||||||
|
|
||||||
lapic [IA-32,APIC] Enable the local APIC even if BIOS disabled it.
|
lapic [IA-32,APIC] Enable the local APIC even if BIOS
|
||||||
|
disabled it.
|
||||||
|
|
||||||
lasi= [HW,SCSI] PARISC LASI driver for the 53c700 chip
|
lasi= [HW,SCSI] PARISC LASI driver for the 53c700 chip
|
||||||
Format: addr:<io>,irq:<irq>
|
Format: addr:<io>,irq:<irq>
|
||||||
|
|
||||||
llsc*= [IA64]
|
llsc*= [IA64] See function print_params() in
|
||||||
See function print_params() in arch/ia64/sn/kernel/llsc4.c.
|
arch/ia64/sn/kernel/llsc4.c.
|
||||||
|
|
||||||
load_ramdisk= [RAM] List of ramdisks to load from floppy
|
load_ramdisk= [RAM] List of ramdisks to load from floppy
|
||||||
See Documentation/ramdisk.txt.
|
See Documentation/ramdisk.txt.
|
||||||
|
@ -713,8 +725,9 @@ running once the system is up.
|
||||||
7 (KERN_DEBUG) debug-level messages
|
7 (KERN_DEBUG) debug-level messages
|
||||||
|
|
||||||
log_buf_len=n Sets the size of the printk ring buffer, in bytes.
|
log_buf_len=n Sets the size of the printk ring buffer, in bytes.
|
||||||
Format is n, nk, nM. n must be a power of two. The
|
Format: { n | nk | nM }
|
||||||
default is set in kernel config.
|
n must be a power of two. The default size
|
||||||
|
is set in the kernel config file.
|
||||||
|
|
||||||
lp=0 [LP] Specify parallel ports to use, e.g,
|
lp=0 [LP] Specify parallel ports to use, e.g,
|
||||||
lp=port[,port...] lp=none,parport0 (lp0 not configured, lp1 uses
|
lp=port[,port...] lp=none,parport0 (lp0 not configured, lp1 uses
|
||||||
|
@ -750,23 +763,23 @@ running once the system is up.
|
||||||
ltpc= [NET]
|
ltpc= [NET]
|
||||||
Format: <io>,<irq>,<dma>
|
Format: <io>,<irq>,<dma>
|
||||||
|
|
||||||
mac5380= [HW,SCSI]
|
mac5380= [HW,SCSI] Format:
|
||||||
Format: <can_queue>,<cmd_per_lun>,<sg_tablesize>,<hostid>,<use_tags>
|
<can_queue>,<cmd_per_lun>,<sg_tablesize>,<hostid>,<use_tags>
|
||||||
|
|
||||||
mac53c9x= [HW,SCSI]
|
mac53c9x= [HW,SCSI] Format:
|
||||||
Format: <num_esps>,<disconnect>,<nosync>,<can_queue>,<cmd_per_lun>,<sg_tablesize>,<hostid>,<use_tags>
|
<num_esps>,<disconnect>,<nosync>,<can_queue>,<cmd_per_lun>,<sg_tablesize>,<hostid>,<use_tags>
|
||||||
|
|
||||||
machvec= [IA64]
|
machvec= [IA64] Force the use of a particular machine-vector
|
||||||
Force the use of a particular machine-vector (machvec) in a generic
|
(machvec) in a generic kernel.
|
||||||
kernel. Example: machvec=hpzx1_swiotlb
|
Example: machvec=hpzx1_swiotlb
|
||||||
|
|
||||||
mad16= [HW,OSS]
|
mad16= [HW,OSS] Format:
|
||||||
Format: <io>,<irq>,<dma>,<dma16>,<mpu_io>,<mpu_irq>,<joystick>
|
<io>,<irq>,<dma>,<dma16>,<mpu_io>,<mpu_irq>,<joystick>
|
||||||
|
|
||||||
maui= [HW,OSS]
|
maui= [HW,OSS]
|
||||||
Format: <io>,<irq>
|
Format: <io>,<irq>
|
||||||
|
|
||||||
max_loop= [LOOP] Maximum number of loopback devices that can
|
max_loop= [LOOP] Maximum number of loopback devices that can
|
||||||
be mounted
|
be mounted
|
||||||
Format: <1-256>
|
Format: <1-256>
|
||||||
|
|
||||||
|
@ -776,11 +789,11 @@ running once the system is up.
|
||||||
max_addr=[KMG] [KNL,BOOT,ia64] All physical memory greater than or
|
max_addr=[KMG] [KNL,BOOT,ia64] All physical memory greater than or
|
||||||
equal to this physical address is ignored.
|
equal to this physical address is ignored.
|
||||||
|
|
||||||
max_luns= [SCSI] Maximum number of LUNs to probe
|
max_luns= [SCSI] Maximum number of LUNs to probe.
|
||||||
Should be between 1 and 2^32-1.
|
Should be between 1 and 2^32-1.
|
||||||
|
|
||||||
max_report_luns=
|
max_report_luns=
|
||||||
[SCSI] Maximum number of LUNs received
|
[SCSI] Maximum number of LUNs received.
|
||||||
Should be between 1 and 16384.
|
Should be between 1 and 16384.
|
||||||
|
|
||||||
mca-pentium [BUGS=IA-32]
|
mca-pentium [BUGS=IA-32]
|
||||||
|
@ -796,11 +809,11 @@ running once the system is up.
|
||||||
|
|
||||||
md= [HW] RAID subsystems devices and level
|
md= [HW] RAID subsystems devices and level
|
||||||
See Documentation/md.txt.
|
See Documentation/md.txt.
|
||||||
|
|
||||||
mdacon= [MDA]
|
mdacon= [MDA]
|
||||||
Format: <first>,<last>
|
Format: <first>,<last>
|
||||||
Specifies range of consoles to be captured by the MDA.
|
Specifies range of consoles to be captured by the MDA.
|
||||||
|
|
||||||
mem=nn[KMG] [KNL,BOOT] Force usage of a specific amount of memory
|
mem=nn[KMG] [KNL,BOOT] Force usage of a specific amount of memory
|
||||||
Amount of memory to be used when the kernel is not able
|
Amount of memory to be used when the kernel is not able
|
||||||
to see the whole system memory or for test.
|
to see the whole system memory or for test.
|
||||||
|
@ -851,15 +864,15 @@ running once the system is up.
|
||||||
MTD_Partition= [MTD]
|
MTD_Partition= [MTD]
|
||||||
Format: <name>,<region-number>,<size>,<offset>
|
Format: <name>,<region-number>,<size>,<offset>
|
||||||
|
|
||||||
MTD_Region= [MTD]
|
MTD_Region= [MTD] Format:
|
||||||
Format: <name>,<region-number>[,<base>,<size>,<buswidth>,<altbuswidth>]
|
<name>,<region-number>[,<base>,<size>,<buswidth>,<altbuswidth>]
|
||||||
|
|
||||||
mtdparts= [MTD]
|
mtdparts= [MTD]
|
||||||
See drivers/mtd/cmdline.c.
|
See drivers/mtd/cmdline.c.
|
||||||
|
|
||||||
mtouchusb.raw_coordinates=
|
mtouchusb.raw_coordinates=
|
||||||
[HW] Make the MicroTouch USB driver use raw coordinates ('y', default)
|
[HW] Make the MicroTouch USB driver use raw coordinates
|
||||||
or cooked coordinates ('n')
|
('y', default) or cooked coordinates ('n')
|
||||||
|
|
||||||
n2= [NET] SDL Inc. RISCom/N2 synchronous serial card
|
n2= [NET] SDL Inc. RISCom/N2 synchronous serial card
|
||||||
|
|
||||||
|
@ -880,7 +893,9 @@ running once the system is up.
|
||||||
Format: <irq>,<io>,<mem_start>,<mem_end>,<name>
|
Format: <irq>,<io>,<mem_start>,<mem_end>,<name>
|
||||||
Note that mem_start is often overloaded to mean
|
Note that mem_start is often overloaded to mean
|
||||||
something different and driver-specific.
|
something different and driver-specific.
|
||||||
|
This usage is only documented in each driver source
|
||||||
|
file if at all.
|
||||||
|
|
||||||
nfsaddrs= [NFS]
|
nfsaddrs= [NFS]
|
||||||
See Documentation/nfsroot.txt.
|
See Documentation/nfsroot.txt.
|
||||||
|
|
||||||
|
@ -893,8 +908,8 @@ running once the system is up.
|
||||||
emulation library even if a 387 maths coprocessor
|
emulation library even if a 387 maths coprocessor
|
||||||
is present.
|
is present.
|
||||||
|
|
||||||
noalign [KNL,ARM]
|
noalign [KNL,ARM]
|
||||||
|
|
||||||
noapic [SMP,APIC] Tells the kernel to not make use of any
|
noapic [SMP,APIC] Tells the kernel to not make use of any
|
||||||
IOAPICs that may be present in the system.
|
IOAPICs that may be present in the system.
|
||||||
|
|
||||||
|
@ -905,19 +920,19 @@ running once the system is up.
|
||||||
on "Classic" PPC cores.
|
on "Classic" PPC cores.
|
||||||
|
|
||||||
nocache [ARM]
|
nocache [ARM]
|
||||||
|
|
||||||
nodisconnect [HW,SCSI,M68K] Disables SCSI disconnects.
|
nodisconnect [HW,SCSI,M68K] Disables SCSI disconnects.
|
||||||
|
|
||||||
noexec [IA-64]
|
noexec [IA-64]
|
||||||
|
|
||||||
noexec [IA-32, X86-64]
|
noexec [IA-32,X86-64]
|
||||||
noexec=on: enable non-executable mappings (default)
|
noexec=on: enable non-executable mappings (default)
|
||||||
noexec=off: disable nn-executable mappings
|
noexec=off: disable nn-executable mappings
|
||||||
|
|
||||||
nofxsr [BUGS=IA-32]
|
nofxsr [BUGS=IA-32]
|
||||||
|
|
||||||
nohlt [BUGS=ARM]
|
nohlt [BUGS=ARM]
|
||||||
|
|
||||||
no-hlt [BUGS=IA-32] Tells the kernel that the hlt
|
no-hlt [BUGS=IA-32] Tells the kernel that the hlt
|
||||||
instruction doesn't work correctly and not to
|
instruction doesn't work correctly and not to
|
||||||
use it.
|
use it.
|
||||||
|
@ -948,8 +963,9 @@ running once the system is up.
|
||||||
|
|
||||||
noresidual [PPC] Don't use residual data on PReP machines.
|
noresidual [PPC] Don't use residual data on PReP machines.
|
||||||
|
|
||||||
noresume [SWSUSP] Disables resume and restore original swap space.
|
noresume [SWSUSP] Disables resume and restores original swap
|
||||||
|
space.
|
||||||
|
|
||||||
no-scroll [VGA] Disables scrollback.
|
no-scroll [VGA] Disables scrollback.
|
||||||
This is required for the Braillex ib80-piezo Braille
|
This is required for the Braillex ib80-piezo Braille
|
||||||
reader made by F.H. Papenmeier (Germany).
|
reader made by F.H. Papenmeier (Germany).
|
||||||
|
@ -965,16 +981,16 @@ running once the system is up.
|
||||||
nousb [USB] Disable the USB subsystem
|
nousb [USB] Disable the USB subsystem
|
||||||
|
|
||||||
nowb [ARM]
|
nowb [ARM]
|
||||||
|
|
||||||
opl3= [HW,OSS]
|
opl3= [HW,OSS]
|
||||||
Format: <io>
|
Format: <io>
|
||||||
|
|
||||||
opl3sa= [HW,OSS]
|
opl3sa= [HW,OSS]
|
||||||
Format: <io>,<irq>,<dma>,<dma2>,<mpu_io>,<mpu_irq>
|
Format: <io>,<irq>,<dma>,<dma2>,<mpu_io>,<mpu_irq>
|
||||||
|
|
||||||
opl3sa2= [HW,OSS]
|
opl3sa2= [HW,OSS] Format:
|
||||||
Format: <io>,<irq>,<dma>,<dma2>,<mss_io>,<mpu_io>,<ymode>,<loopback>[,<isapnp>,<multiple]
|
<io>,<irq>,<dma>,<dma2>,<mss_io>,<mpu_io>,<ymode>,<loopback>[,<isapnp>,<multiple]
|
||||||
|
|
||||||
oprofile.timer= [HW]
|
oprofile.timer= [HW]
|
||||||
Use timer interrupt instead of performance counters
|
Use timer interrupt instead of performance counters
|
||||||
|
|
||||||
|
@ -993,36 +1009,33 @@ running once the system is up.
|
||||||
Format: <parport#>
|
Format: <parport#>
|
||||||
parkbd.mode= [HW] Parallel port keyboard adapter mode of operation,
|
parkbd.mode= [HW] Parallel port keyboard adapter mode of operation,
|
||||||
0 for XT, 1 for AT (default is AT).
|
0 for XT, 1 for AT (default is AT).
|
||||||
Format: <mode>
|
Format: <mode>
|
||||||
|
|
||||||
parport=0 [HW,PPT] Specify parallel ports. 0 disables.
|
parport= [HW,PPT] Specify parallel ports. 0 disables.
|
||||||
parport=auto Use 'auto' to force the driver to use
|
Format: { 0 | auto | 0xBBB[,IRQ[,DMA]] }
|
||||||
parport=0xBBB[,IRQ[,DMA]] any IRQ/DMA settings detected (the
|
Use 'auto' to force the driver to use any
|
||||||
default is to ignore detected IRQ/DMA
|
IRQ/DMA settings detected (the default is to
|
||||||
settings because of possible
|
ignore detected IRQ/DMA settings because of
|
||||||
conflicts). You can specify the base
|
possible conflicts). You can specify the base
|
||||||
address, IRQ, and DMA settings; IRQ and
|
address, IRQ, and DMA settings; IRQ and DMA
|
||||||
DMA should be numbers, or 'auto' (for
|
should be numbers, or 'auto' (for using detected
|
||||||
using detected settings on that
|
settings on that particular port), or 'nofifo'
|
||||||
particular port), or 'nofifo' (to avoid
|
(to avoid using a FIFO even if it is detected).
|
||||||
using a FIFO even if it is detected).
|
Parallel ports are assigned in the order they
|
||||||
Parallel ports are assigned in the
|
are specified on the command line, starting
|
||||||
order they are specified on the command
|
with parport0.
|
||||||
line, starting with parport0.
|
|
||||||
|
|
||||||
parport_init_mode=
|
parport_init_mode= [HW,PPT]
|
||||||
[HW,PPT] Configure VIA parallel port to
|
Configure VIA parallel port to operate in
|
||||||
operate in specific mode. This is
|
a specific mode. This is necessary on Pegasos
|
||||||
necessary on Pegasos computer where
|
computer where firmware has no options for setting
|
||||||
firmware has no options for setting up
|
up parallel port mode and sets it to spp.
|
||||||
parallel port mode and sets it to
|
Currently this function knows 686a and 8231 chips.
|
||||||
spp. Currently this function knows
|
|
||||||
686a and 8231 chips.
|
|
||||||
Format: [spp|ps2|epp|ecp|ecpepp]
|
Format: [spp|ps2|epp|ecp|ecpepp]
|
||||||
|
|
||||||
pas2= [HW,OSS]
|
pas2= [HW,OSS] Format:
|
||||||
Format: <io>,<irq>,<dma>,<dma16>,<sb_io>,<sb_irq>,<sb_dma>,<sb_dma16>
|
<io>,<irq>,<dma>,<dma16>,<sb_io>,<sb_irq>,<sb_dma>,<sb_dma16>
|
||||||
|
|
||||||
pas16= [HW,SCSI]
|
pas16= [HW,SCSI]
|
||||||
See header of drivers/scsi/pas16.c.
|
See header of drivers/scsi/pas16.c.
|
||||||
|
|
||||||
|
@ -1032,64 +1045,67 @@ running once the system is up.
|
||||||
See header of drivers/block/paride/pcd.c.
|
See header of drivers/block/paride/pcd.c.
|
||||||
See also Documentation/paride.txt.
|
See also Documentation/paride.txt.
|
||||||
|
|
||||||
pci=option[,option...] [PCI] various PCI subsystem options:
|
pci=option[,option...] [PCI] various PCI subsystem options:
|
||||||
off [IA-32] don't probe for the PCI bus
|
off [IA-32] don't probe for the PCI bus
|
||||||
bios [IA-32] force use of PCI BIOS, don't access
|
bios [IA-32] force use of PCI BIOS, don't access
|
||||||
the hardware directly. Use this if your machine
|
the hardware directly. Use this if your machine
|
||||||
has a non-standard PCI host bridge.
|
has a non-standard PCI host bridge.
|
||||||
nobios [IA-32] disallow use of PCI BIOS, only direct
|
nobios [IA-32] disallow use of PCI BIOS, only direct
|
||||||
hardware access methods are allowed. Use this
|
hardware access methods are allowed. Use this
|
||||||
if you experience crashes upon bootup and you
|
if you experience crashes upon bootup and you
|
||||||
suspect they are caused by the BIOS.
|
suspect they are caused by the BIOS.
|
||||||
conf1 [IA-32] Force use of PCI Configuration Mechanism 1.
|
conf1 [IA-32] Force use of PCI Configuration
|
||||||
conf2 [IA-32] Force use of PCI Configuration Mechanism 2.
|
Mechanism 1.
|
||||||
nosort [IA-32] Don't sort PCI devices according to
|
conf2 [IA-32] Force use of PCI Configuration
|
||||||
order given by the PCI BIOS. This sorting is done
|
Mechanism 2.
|
||||||
to get a device order compatible with older kernels.
|
nosort [IA-32] Don't sort PCI devices according to
|
||||||
biosirq [IA-32] Use PCI BIOS calls to get the interrupt
|
order given by the PCI BIOS. This sorting is
|
||||||
routing table. These calls are known to be buggy
|
done to get a device order compatible with
|
||||||
on several machines and they hang the machine when used,
|
older kernels.
|
||||||
but on other computers it's the only way to get the
|
biosirq [IA-32] Use PCI BIOS calls to get the interrupt
|
||||||
interrupt routing table. Try this option if the kernel
|
routing table. These calls are known to be buggy
|
||||||
is unable to allocate IRQs or discover secondary PCI
|
on several machines and they hang the machine
|
||||||
buses on your motherboard.
|
when used, but on other computers it's the only
|
||||||
rom [IA-32] Assign address space to expansion ROMs.
|
way to get the interrupt routing table. Try
|
||||||
Use with caution as certain devices share address
|
this option if the kernel is unable to allocate
|
||||||
decoders between ROMs and other resources.
|
IRQs or discover secondary PCI buses on your
|
||||||
irqmask=0xMMMM [IA-32] Set a bit mask of IRQs allowed to be assigned
|
motherboard.
|
||||||
automatically to PCI devices. You can make the kernel
|
rom [IA-32] Assign address space to expansion ROMs.
|
||||||
exclude IRQs of your ISA cards this way.
|
Use with caution as certain devices share
|
||||||
|
address decoders between ROMs and other
|
||||||
|
resources.
|
||||||
|
irqmask=0xMMMM [IA-32] Set a bit mask of IRQs allowed to be
|
||||||
|
assigned automatically to PCI devices. You can
|
||||||
|
make the kernel exclude IRQs of your ISA cards
|
||||||
|
this way.
|
||||||
pirqaddr=0xAAAAA [IA-32] Specify the physical address
|
pirqaddr=0xAAAAA [IA-32] Specify the physical address
|
||||||
of the PIRQ table (normally generated
|
of the PIRQ table (normally generated
|
||||||
by the BIOS) if it is outside the
|
by the BIOS) if it is outside the
|
||||||
F0000h-100000h range.
|
F0000h-100000h range.
|
||||||
lastbus=N [IA-32] Scan all buses till bus #N. Can be useful
|
lastbus=N [IA-32] Scan all buses thru bus #N. Can be
|
||||||
if the kernel is unable to find your secondary buses
|
useful if the kernel is unable to find your
|
||||||
and you want to tell it explicitly which ones they are.
|
secondary buses and you want to tell it
|
||||||
assign-busses [IA-32] Always assign all PCI bus
|
explicitly which ones they are.
|
||||||
numbers ourselves, overriding
|
assign-busses [IA-32] Always assign all PCI bus
|
||||||
whatever the firmware may have
|
numbers ourselves, overriding
|
||||||
done.
|
whatever the firmware may have done.
|
||||||
usepirqmask [IA-32] Honor the possible IRQ mask
|
usepirqmask [IA-32] Honor the possible IRQ mask stored
|
||||||
stored in the BIOS $PIR table. This is
|
in the BIOS $PIR table. This is needed on
|
||||||
needed on some systems with broken
|
some systems with broken BIOSes, notably
|
||||||
BIOSes, notably some HP Pavilion N5400
|
some HP Pavilion N5400 and Omnibook XE3
|
||||||
and Omnibook XE3 notebooks. This will
|
notebooks. This will have no effect if ACPI
|
||||||
have no effect if ACPI IRQ routing is
|
IRQ routing is enabled.
|
||||||
enabled.
|
noacpi [IA-32] Do not use ACPI for IRQ routing
|
||||||
noacpi [IA-32] Do not use ACPI for IRQ routing
|
or for PCI scanning.
|
||||||
or for PCI scanning.
|
routeirq Do IRQ routing for all PCI devices.
|
||||||
routeirq Do IRQ routing for all PCI devices.
|
This is normally done in pci_enable_device(),
|
||||||
This is normally done in pci_enable_device(),
|
so this option is a temporary workaround
|
||||||
so this option is a temporary workaround
|
for broken drivers that don't call it.
|
||||||
for broken drivers that don't call it.
|
firmware [ARM] Do not re-enumerate the bus but instead
|
||||||
|
just use the configuration from the
|
||||||
firmware [ARM] Do not re-enumerate the bus but
|
bootloader. This is currently used on
|
||||||
instead just use the configuration
|
IXP2000 systems where the bus has to be
|
||||||
from the bootloader. This is currently
|
configured a certain way for adjunct CPUs.
|
||||||
used on IXP2000 systems where the
|
|
||||||
bus has to be configured a certain way
|
|
||||||
for adjunct CPUs.
|
|
||||||
|
|
||||||
pcmv= [HW,PCMCIA] BadgePAD 4
|
pcmv= [HW,PCMCIA] BadgePAD 4
|
||||||
|
|
||||||
|
@ -1127,19 +1143,20 @@ running once the system is up.
|
||||||
[ISAPNP] Exclude DMAs for the autoconfiguration
|
[ISAPNP] Exclude DMAs for the autoconfiguration
|
||||||
|
|
||||||
pnp_reserve_io= [ISAPNP] Exclude I/O ports for the autoconfiguration
|
pnp_reserve_io= [ISAPNP] Exclude I/O ports for the autoconfiguration
|
||||||
Ranges are in pairs (I/O port base and size).
|
Ranges are in pairs (I/O port base and size).
|
||||||
|
|
||||||
pnp_reserve_mem=
|
pnp_reserve_mem=
|
||||||
[ISAPNP] Exclude memory regions for the autoconfiguration
|
[ISAPNP] Exclude memory regions for the
|
||||||
|
autoconfiguration.
|
||||||
Ranges are in pairs (memory base and size).
|
Ranges are in pairs (memory base and size).
|
||||||
|
|
||||||
profile= [KNL] Enable kernel profiling via /proc/profile
|
profile= [KNL] Enable kernel profiling via /proc/profile
|
||||||
{ schedule | <number> }
|
Format: [schedule,]<number>
|
||||||
(param: schedule - profile schedule points}
|
Param: "schedule" - profile schedule points.
|
||||||
(param: profile step/bucket size as a power of 2 for
|
Param: <number> - step/bucket size as a power of 2 for
|
||||||
statistical time based profiling)
|
statistical time based profiling.
|
||||||
|
|
||||||
processor.max_cstate= [HW, ACPI]
|
processor.max_cstate= [HW,ACPI]
|
||||||
Limit processor to maximum C-state
|
Limit processor to maximum C-state
|
||||||
max_cstate=9 overrides any DMI blacklist limit.
|
max_cstate=9 overrides any DMI blacklist limit.
|
||||||
|
|
||||||
|
@ -1147,27 +1164,28 @@ running once the system is up.
|
||||||
before loading.
|
before loading.
|
||||||
See Documentation/ramdisk.txt.
|
See Documentation/ramdisk.txt.
|
||||||
|
|
||||||
psmouse.proto= [HW,MOUSE] Highest PS2 mouse protocol extension to
|
psmouse.proto= [HW,MOUSE] Highest PS2 mouse protocol extension to
|
||||||
probe for (bare|imps|exps|lifebook|any).
|
probe for; one of (bare|imps|exps|lifebook|any).
|
||||||
psmouse.rate= [HW,MOUSE] Set desired mouse report rate, in reports
|
psmouse.rate= [HW,MOUSE] Set desired mouse report rate, in reports
|
||||||
per second.
|
per second.
|
||||||
psmouse.resetafter=
|
psmouse.resetafter= [HW,MOUSE]
|
||||||
[HW,MOUSE] Try to reset the device after so many bad packets
|
Try to reset the device after so many bad packets
|
||||||
(0 = never).
|
(0 = never).
|
||||||
psmouse.resolution=
|
psmouse.resolution=
|
||||||
[HW,MOUSE] Set desired mouse resolution, in dpi.
|
[HW,MOUSE] Set desired mouse resolution, in dpi.
|
||||||
psmouse.smartscroll=
|
psmouse.smartscroll=
|
||||||
[HW,MOUSE] Controls Logitech smartscroll autorepeat,
|
[HW,MOUSE] Controls Logitech smartscroll autorepeat.
|
||||||
0 = disabled, 1 = enabled (default).
|
0 = disabled, 1 = enabled (default).
|
||||||
|
|
||||||
pss= [HW,OSS] Personal Sound System (ECHO ESC614)
|
pss= [HW,OSS] Personal Sound System (ECHO ESC614)
|
||||||
Format: <io>,<mss_io>,<mss_irq>,<mss_dma>,<mpu_io>,<mpu_irq>
|
Format:
|
||||||
|
<io>,<mss_io>,<mss_irq>,<mss_dma>,<mpu_io>,<mpu_irq>
|
||||||
|
|
||||||
pt. [PARIDE]
|
pt. [PARIDE]
|
||||||
See Documentation/paride.txt.
|
See Documentation/paride.txt.
|
||||||
|
|
||||||
quiet= [KNL] Disable log messages
|
quiet= [KNL] Disable log messages
|
||||||
|
|
||||||
r128= [HW,DRM]
|
r128= [HW,DRM]
|
||||||
|
|
||||||
raid= [HW,RAID]
|
raid= [HW,RAID]
|
||||||
|
@ -1176,10 +1194,9 @@ running once the system is up.
|
||||||
ramdisk= [RAM] Sizes of RAM disks in kilobytes [deprecated]
|
ramdisk= [RAM] Sizes of RAM disks in kilobytes [deprecated]
|
||||||
See Documentation/ramdisk.txt.
|
See Documentation/ramdisk.txt.
|
||||||
|
|
||||||
ramdisk_blocksize=
|
ramdisk_blocksize= [RAM]
|
||||||
[RAM]
|
|
||||||
See Documentation/ramdisk.txt.
|
See Documentation/ramdisk.txt.
|
||||||
|
|
||||||
ramdisk_size= [RAM] Sizes of RAM disks in kilobytes
|
ramdisk_size= [RAM] Sizes of RAM disks in kilobytes
|
||||||
New name for the ramdisk parameter.
|
New name for the ramdisk parameter.
|
||||||
See Documentation/ramdisk.txt.
|
See Documentation/ramdisk.txt.
|
||||||
|
@ -1195,7 +1212,8 @@ running once the system is up.
|
||||||
|
|
||||||
reserve= [KNL,BUGS] Force the kernel to ignore some iomem area
|
reserve= [KNL,BUGS] Force the kernel to ignore some iomem area
|
||||||
|
|
||||||
resume= [SWSUSP] Specify the partition device for software suspension
|
resume= [SWSUSP]
|
||||||
|
Specify the partition device for software suspend
|
||||||
|
|
||||||
rhash_entries= [KNL,NET]
|
rhash_entries= [KNL,NET]
|
||||||
Set number of hash buckets for route cache
|
Set number of hash buckets for route cache
|
||||||
|
@ -1225,7 +1243,7 @@ running once the system is up.
|
||||||
Format: <io>,<irq>,<dma>,<dma2>
|
Format: <io>,<irq>,<dma>,<dma2>
|
||||||
|
|
||||||
sbni= [NET] Granch SBNI12 leased line adapter
|
sbni= [NET] Granch SBNI12 leased line adapter
|
||||||
|
|
||||||
sbpcd= [HW,CD] Soundblaster CD adapter
|
sbpcd= [HW,CD] Soundblaster CD adapter
|
||||||
Format: <io>,<type>
|
Format: <io>,<type>
|
||||||
See a comment before function sbpcd_setup() in
|
See a comment before function sbpcd_setup() in
|
||||||
|
@ -1258,21 +1276,20 @@ running once the system is up.
|
||||||
|
|
||||||
serialnumber [BUGS=IA-32]
|
serialnumber [BUGS=IA-32]
|
||||||
|
|
||||||
sg_def_reserved_size=
|
sg_def_reserved_size= [SCSI]
|
||||||
[SCSI]
|
|
||||||
|
|
||||||
sgalaxy= [HW,OSS]
|
sgalaxy= [HW,OSS]
|
||||||
Format: <io>,<irq>,<dma>,<dma2>,<sgbase>
|
Format: <io>,<irq>,<dma>,<dma2>,<sgbase>
|
||||||
|
|
||||||
shapers= [NET]
|
shapers= [NET]
|
||||||
Maximal number of shapers.
|
Maximal number of shapers.
|
||||||
|
|
||||||
sim710= [SCSI,HW]
|
sim710= [SCSI,HW]
|
||||||
See header of drivers/scsi/sim710.c.
|
See header of drivers/scsi/sim710.c.
|
||||||
|
|
||||||
simeth= [IA-64]
|
simeth= [IA-64]
|
||||||
simscsi=
|
simscsi=
|
||||||
|
|
||||||
sjcd= [HW,CD]
|
sjcd= [HW,CD]
|
||||||
Format: <io>,<irq>,<dma>
|
Format: <io>,<irq>,<dma>
|
||||||
See header of drivers/cdrom/sjcd.c.
|
See header of drivers/cdrom/sjcd.c.
|
||||||
|
@ -1403,10 +1420,10 @@ running once the system is up.
|
||||||
snd-wavefront= [HW,ALSA]
|
snd-wavefront= [HW,ALSA]
|
||||||
|
|
||||||
snd-ymfpci= [HW,ALSA]
|
snd-ymfpci= [HW,ALSA]
|
||||||
|
|
||||||
sonicvibes= [HW,OSS]
|
sonicvibes= [HW,OSS]
|
||||||
Format: <reverb>
|
Format: <reverb>
|
||||||
|
|
||||||
sonycd535= [HW,CD]
|
sonycd535= [HW,CD]
|
||||||
Format: <io>[,<irq>]
|
Format: <io>[,<irq>]
|
||||||
|
|
||||||
|
@ -1423,7 +1440,7 @@ running once the system is up.
|
||||||
|
|
||||||
sscape= [HW,OSS]
|
sscape= [HW,OSS]
|
||||||
Format: <io>,<irq>,<dma>,<mpu_io>,<mpu_irq>
|
Format: <io>,<irq>,<dma>,<mpu_io>,<mpu_irq>
|
||||||
|
|
||||||
st= [HW,SCSI] SCSI tape parameters (buffers, etc.)
|
st= [HW,SCSI] SCSI tape parameters (buffers, etc.)
|
||||||
See Documentation/scsi/st.txt.
|
See Documentation/scsi/st.txt.
|
||||||
|
|
||||||
|
@ -1446,7 +1463,7 @@ running once the system is up.
|
||||||
stram_swap= [HW,M68k]
|
stram_swap= [HW,M68k]
|
||||||
|
|
||||||
swiotlb= [IA-64] Number of I/O TLB slabs
|
swiotlb= [IA-64] Number of I/O TLB slabs
|
||||||
|
|
||||||
switches= [HW,M68k]
|
switches= [HW,M68k]
|
||||||
|
|
||||||
sym53c416= [HW,SCSI]
|
sym53c416= [HW,SCSI]
|
||||||
|
@ -1479,14 +1496,16 @@ running once the system is up.
|
||||||
tp720= [HW,PS2]
|
tp720= [HW,PS2]
|
||||||
|
|
||||||
trix= [HW,OSS] MediaTrix AudioTrix Pro
|
trix= [HW,OSS] MediaTrix AudioTrix Pro
|
||||||
Format: <io>,<irq>,<dma>,<dma2>,<sb_io>,<sb_irq>,<sb_dma>,<mpu_io>,<mpu_irq>
|
Format:
|
||||||
|
<io>,<irq>,<dma>,<dma2>,<sb_io>,<sb_irq>,<sb_dma>,<mpu_io>,<mpu_irq>
|
||||||
|
|
||||||
tsdev.xres= [TS] Horizontal screen resolution.
|
tsdev.xres= [TS] Horizontal screen resolution.
|
||||||
tsdev.yres= [TS] Vertical screen resolution.
|
tsdev.yres= [TS] Vertical screen resolution.
|
||||||
|
|
||||||
turbografx.map[2|3]=
|
turbografx.map[2|3]= [HW,JOY]
|
||||||
[HW,JOY] TurboGraFX parallel port interface
|
TurboGraFX parallel port interface
|
||||||
Format: <port#>,<js1>,<js2>,<js3>,<js4>,<js5>,<js6>,<js7>
|
Format:
|
||||||
|
<port#>,<js1>,<js2>,<js3>,<js4>,<js5>,<js6>,<js7>
|
||||||
See also Documentation/input/joystick-parport.txt
|
See also Documentation/input/joystick-parport.txt
|
||||||
|
|
||||||
u14-34f= [HW,SCSI] UltraStor 14F/34F SCSI host adapter
|
u14-34f= [HW,SCSI] UltraStor 14F/34F SCSI host adapter
|
||||||
|
@ -1502,17 +1521,18 @@ running once the system is up.
|
||||||
|
|
||||||
usbhid.mousepoll=
|
usbhid.mousepoll=
|
||||||
[USBHID] The interval which mice are to be polled at.
|
[USBHID] The interval which mice are to be polled at.
|
||||||
|
|
||||||
video= [FB] Frame buffer configuration
|
video= [FB] Frame buffer configuration
|
||||||
See Documentation/fb/modedb.txt.
|
See Documentation/fb/modedb.txt.
|
||||||
|
|
||||||
vga= [BOOT,IA-32] Select a particular video mode
|
vga= [BOOT,IA-32] Select a particular video mode
|
||||||
See Documentation/i386/boot.txt and Documentation/svga.txt.
|
See Documentation/i386/boot.txt and
|
||||||
|
Documentation/svga.txt.
|
||||||
Use vga=ask for menu.
|
Use vga=ask for menu.
|
||||||
This is actually a boot loader parameter; the value is
|
This is actually a boot loader parameter; the value is
|
||||||
passed to the kernel using a special protocol.
|
passed to the kernel using a special protocol.
|
||||||
|
|
||||||
vmalloc=nn[KMG] [KNL,BOOT] forces the vmalloc area to have an exact
|
vmalloc=nn[KMG] [KNL,BOOT] Forces the vmalloc area to have an exact
|
||||||
size of <nn>. This can be used to increase the
|
size of <nn>. This can be used to increase the
|
||||||
minimum size (128MB on x86). It can also be used to
|
minimum size (128MB on x86). It can also be used to
|
||||||
decrease the size and leave more room for directly
|
decrease the size and leave more room for directly
|
||||||
|
@ -1520,11 +1540,11 @@ running once the system is up.
|
||||||
|
|
||||||
vmhalt= [KNL,S390]
|
vmhalt= [KNL,S390]
|
||||||
|
|
||||||
vmpoff= [KNL,S390]
|
vmpoff= [KNL,S390]
|
||||||
|
|
||||||
waveartist= [HW,OSS]
|
waveartist= [HW,OSS]
|
||||||
Format: <io>,<irq>,<dma>,<dma2>
|
Format: <io>,<irq>,<dma>,<dma2>
|
||||||
|
|
||||||
wd33c93= [HW,SCSI]
|
wd33c93= [HW,SCSI]
|
||||||
See header of drivers/scsi/wd33c93.c.
|
See header of drivers/scsi/wd33c93.c.
|
||||||
|
|
||||||
|
@ -1538,21 +1558,25 @@ running once the system is up.
|
||||||
xd_geo= See header of drivers/block/xd.c.
|
xd_geo= See header of drivers/block/xd.c.
|
||||||
|
|
||||||
xirc2ps_cs= [NET,PCMCIA]
|
xirc2ps_cs= [NET,PCMCIA]
|
||||||
Format: <irq>,<irq_mask>,<io>,<full_duplex>,<do_sound>,<lockup_hack>[,<irq2>[,<irq3>[,<irq4>]]]
|
Format:
|
||||||
|
<irq>,<irq_mask>,<io>,<full_duplex>,<do_sound>,<lockup_hack>[,<irq2>[,<irq3>[,<irq4>]]]
|
||||||
|
|
||||||
|
|
||||||
|
______________________________________________________________________
|
||||||
Changelog:
|
Changelog:
|
||||||
|
|
||||||
|
2000-06-?? Mr. Unknown
|
||||||
The last known update (for 2.4.0) - the changelog was not kept before.
|
The last known update (for 2.4.0) - the changelog was not kept before.
|
||||||
2000-06-?? Mr. Unknown
|
|
||||||
|
|
||||||
|
2002-11-24 Petr Baudis <pasky@ucw.cz>
|
||||||
|
Randy Dunlap <randy.dunlap@verizon.net>
|
||||||
Update for 2.5.49, description for most of the options introduced,
|
Update for 2.5.49, description for most of the options introduced,
|
||||||
references to other documentation (C files, READMEs, ..), added S390,
|
references to other documentation (C files, READMEs, ..), added S390,
|
||||||
PPC, SPARC, MTD, ALSA and OSS category. Minor corrections and
|
PPC, SPARC, MTD, ALSA and OSS category. Minor corrections and
|
||||||
reformatting.
|
reformatting.
|
||||||
2002-11-24 Petr Baudis <pasky@ucw.cz>
|
|
||||||
Randy Dunlap <randy.dunlap@verizon.net>
|
2005-10-19 Randy Dunlap <rdunlap@xenotime.net>
|
||||||
|
Lots of typos, whitespace, some reformatting.
|
||||||
|
|
||||||
TODO:
|
TODO:
|
||||||
|
|
||||||
|
|
|
@ -488,6 +488,7 @@ static int is_pxafb_device(struct device * dev, void * data)
|
||||||
|
|
||||||
unsigned long spitz_get_hsync_len(void)
|
unsigned long spitz_get_hsync_len(void)
|
||||||
{
|
{
|
||||||
|
#ifdef CONFIG_FB_PXA
|
||||||
if (!spitz_pxafb_dev) {
|
if (!spitz_pxafb_dev) {
|
||||||
spitz_pxafb_dev = bus_find_device(&platform_bus_type, NULL, NULL, is_pxafb_device);
|
spitz_pxafb_dev = bus_find_device(&platform_bus_type, NULL, NULL, is_pxafb_device);
|
||||||
if (!spitz_pxafb_dev)
|
if (!spitz_pxafb_dev)
|
||||||
|
@ -496,6 +497,7 @@ unsigned long spitz_get_hsync_len(void)
|
||||||
if (!get_hsync_time)
|
if (!get_hsync_time)
|
||||||
get_hsync_time = symbol_get(pxafb_get_hsync_time);
|
get_hsync_time = symbol_get(pxafb_get_hsync_time);
|
||||||
if (!get_hsync_time)
|
if (!get_hsync_time)
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return pxafb_get_hsync_time(spitz_pxafb_dev);
|
return pxafb_get_hsync_time(spitz_pxafb_dev);
|
||||||
|
|
|
@ -506,8 +506,8 @@ struct mpic * __init mpic_alloc(unsigned long phys_addr,
|
||||||
mpic->senses_count = senses_count;
|
mpic->senses_count = senses_count;
|
||||||
|
|
||||||
/* Map the global registers */
|
/* Map the global registers */
|
||||||
mpic->gregs = ioremap(phys_addr + MPIC_GREG_BASE, 0x1000);
|
mpic->gregs = ioremap(phys_addr + MPIC_GREG_BASE, 0x2000);
|
||||||
mpic->tmregs = mpic->gregs + (MPIC_TIMER_BASE >> 2);
|
mpic->tmregs = mpic->gregs + ((MPIC_TIMER_BASE - MPIC_GREG_BASE) >> 2);
|
||||||
BUG_ON(mpic->gregs == NULL);
|
BUG_ON(mpic->gregs == NULL);
|
||||||
|
|
||||||
/* Reset */
|
/* Reset */
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#include <kern_constants.h>
|
#include <kern_constants.h>
|
||||||
|
|
||||||
#define TASK_DEBUGREGS(task) ((unsigned long *) &(((char *) (task))[HOST_TASK_DEBUGREGS]))
|
#define TASK_DEBUGREGS(task) ((unsigned long *) &(((char *) (task))[HOST_TASK_DEBUGREGS]))
|
||||||
#ifdef CONFIG_MODE_TT
|
#ifdef UML_CONFIG_MODE_TT
|
||||||
#define TASK_EXTERN_PID(task) *((int *) &(((char *) (task))[HOST_TASK_EXTERN_PID]))
|
#define TASK_EXTERN_PID(task) *((int *) &(((char *) (task))[HOST_TASK_EXTERN_PID]))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
#include <kern_constants.h>
|
#include <kern_constants.h>
|
||||||
|
|
||||||
#ifdef CONFIG_MODE_TT
|
#ifdef UML_CONFIG_MODE_TT
|
||||||
#define TASK_EXTERN_PID(task) *((int *) &(((char *) (task))[HOST_TASK_EXTERN_PID]))
|
#define TASK_EXTERN_PID(task) *((int *) &(((char *) (task))[HOST_TASK_EXTERN_PID]))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -1133,10 +1133,10 @@ static void radeon_cp_init_ring_buffer( drm_device_t *dev,
|
||||||
ring_start = (dev_priv->cp_ring->offset
|
ring_start = (dev_priv->cp_ring->offset
|
||||||
- dev->agp->base
|
- dev->agp->base
|
||||||
+ dev_priv->gart_vm_start);
|
+ dev_priv->gart_vm_start);
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
ring_start = (dev_priv->cp_ring->offset
|
ring_start = (dev_priv->cp_ring->offset
|
||||||
- dev->sg->handle
|
- (unsigned long)dev->sg->virtual
|
||||||
+ dev_priv->gart_vm_start);
|
+ dev_priv->gart_vm_start);
|
||||||
|
|
||||||
RADEON_WRITE( RADEON_CP_RB_BASE, ring_start );
|
RADEON_WRITE( RADEON_CP_RB_BASE, ring_start );
|
||||||
|
@ -1164,7 +1164,8 @@ static void radeon_cp_init_ring_buffer( drm_device_t *dev,
|
||||||
drm_sg_mem_t *entry = dev->sg;
|
drm_sg_mem_t *entry = dev->sg;
|
||||||
unsigned long tmp_ofs, page_ofs;
|
unsigned long tmp_ofs, page_ofs;
|
||||||
|
|
||||||
tmp_ofs = dev_priv->ring_rptr->offset - dev->sg->handle;
|
tmp_ofs = dev_priv->ring_rptr->offset -
|
||||||
|
(unsigned long)dev->sg->virtual;
|
||||||
page_ofs = tmp_ofs >> PAGE_SHIFT;
|
page_ofs = tmp_ofs >> PAGE_SHIFT;
|
||||||
|
|
||||||
RADEON_WRITE( RADEON_CP_RB_RPTR_ADDR,
|
RADEON_WRITE( RADEON_CP_RB_RPTR_ADDR,
|
||||||
|
@ -1491,8 +1492,8 @@ static int radeon_do_init_cp( drm_device_t *dev, drm_radeon_init_t *init )
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
dev_priv->gart_buffers_offset = (dev->agp_buffer_map->offset
|
dev_priv->gart_buffers_offset = (dev->agp_buffer_map->offset
|
||||||
- dev->sg->handle
|
- (unsigned long)dev->sg->virtual
|
||||||
+ dev_priv->gart_vm_start);
|
+ dev_priv->gart_vm_start);
|
||||||
|
|
||||||
DRM_DEBUG( "dev_priv->gart_size %d\n",
|
DRM_DEBUG( "dev_priv->gart_size %d\n",
|
||||||
dev_priv->gart_size );
|
dev_priv->gart_size );
|
||||||
|
|
|
@ -396,20 +396,21 @@ static irqreturn_t mthca_tavor_interrupt(int irq, void *dev_ptr, struct pt_regs
|
||||||
writel(dev->eq_table.clr_mask, dev->eq_table.clr_int);
|
writel(dev->eq_table.clr_mask, dev->eq_table.clr_int);
|
||||||
|
|
||||||
ecr = readl(dev->eq_regs.tavor.ecr_base + 4);
|
ecr = readl(dev->eq_regs.tavor.ecr_base + 4);
|
||||||
if (ecr) {
|
if (!ecr)
|
||||||
writel(ecr, dev->eq_regs.tavor.ecr_base +
|
return IRQ_NONE;
|
||||||
MTHCA_ECR_CLR_BASE - MTHCA_ECR_BASE + 4);
|
|
||||||
|
|
||||||
for (i = 0; i < MTHCA_NUM_EQ; ++i)
|
writel(ecr, dev->eq_regs.tavor.ecr_base +
|
||||||
if (ecr & dev->eq_table.eq[i].eqn_mask &&
|
MTHCA_ECR_CLR_BASE - MTHCA_ECR_BASE + 4);
|
||||||
mthca_eq_int(dev, &dev->eq_table.eq[i])) {
|
|
||||||
|
for (i = 0; i < MTHCA_NUM_EQ; ++i)
|
||||||
|
if (ecr & dev->eq_table.eq[i].eqn_mask) {
|
||||||
|
if (mthca_eq_int(dev, &dev->eq_table.eq[i]))
|
||||||
tavor_set_eq_ci(dev, &dev->eq_table.eq[i],
|
tavor_set_eq_ci(dev, &dev->eq_table.eq[i],
|
||||||
dev->eq_table.eq[i].cons_index);
|
dev->eq_table.eq[i].cons_index);
|
||||||
tavor_eq_req_not(dev, dev->eq_table.eq[i].eqn);
|
tavor_eq_req_not(dev, dev->eq_table.eq[i].eqn);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return IRQ_RETVAL(ecr);
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static irqreturn_t mthca_tavor_msi_x_interrupt(int irq, void *eq_ptr,
|
static irqreturn_t mthca_tavor_msi_x_interrupt(int irq, void *eq_ptr,
|
||||||
|
|
|
@ -3568,7 +3568,8 @@ static void md_do_sync(mddev_t *mddev)
|
||||||
mddev->curr_resync = 2;
|
mddev->curr_resync = 2;
|
||||||
|
|
||||||
try_again:
|
try_again:
|
||||||
if (signal_pending(current)) {
|
if (signal_pending(current) ||
|
||||||
|
kthread_should_stop()) {
|
||||||
flush_signals(current);
|
flush_signals(current);
|
||||||
set_bit(MD_RECOVERY_INTR, &mddev->recovery);
|
set_bit(MD_RECOVERY_INTR, &mddev->recovery);
|
||||||
goto skip;
|
goto skip;
|
||||||
|
@ -3590,8 +3591,9 @@ static void md_do_sync(mddev_t *mddev)
|
||||||
*/
|
*/
|
||||||
continue;
|
continue;
|
||||||
prepare_to_wait(&resync_wait, &wq, TASK_INTERRUPTIBLE);
|
prepare_to_wait(&resync_wait, &wq, TASK_INTERRUPTIBLE);
|
||||||
if (!signal_pending(current)
|
if (!signal_pending(current) &&
|
||||||
&& mddev2->curr_resync >= mddev->curr_resync) {
|
!kthread_should_stop() &&
|
||||||
|
mddev2->curr_resync >= mddev->curr_resync) {
|
||||||
printk(KERN_INFO "md: delaying resync of %s"
|
printk(KERN_INFO "md: delaying resync of %s"
|
||||||
" until %s has finished resync (they"
|
" until %s has finished resync (they"
|
||||||
" share one or more physical units)\n",
|
" share one or more physical units)\n",
|
||||||
|
@ -3697,7 +3699,7 @@ static void md_do_sync(mddev_t *mddev)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (signal_pending(current)) {
|
if (signal_pending(current) || kthread_should_stop()) {
|
||||||
/*
|
/*
|
||||||
* got a signal, exit.
|
* got a signal, exit.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -262,7 +262,6 @@ config VIDEO_SAA7134_DVB
|
||||||
depends on VIDEO_SAA7134 && DVB_CORE
|
depends on VIDEO_SAA7134 && DVB_CORE
|
||||||
select VIDEO_BUF_DVB
|
select VIDEO_BUF_DVB
|
||||||
select DVB_MT352
|
select DVB_MT352
|
||||||
select DVB_CX22702
|
|
||||||
select DVB_TDA1004X
|
select DVB_TDA1004X
|
||||||
---help---
|
---help---
|
||||||
This adds support for DVB cards based on the
|
This adds support for DVB cards based on the
|
||||||
|
|
|
@ -241,7 +241,8 @@ static void __devinit quirk_s3_64M(struct pci_dev *dev)
|
||||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_868, quirk_s3_64M );
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_868, quirk_s3_64M );
|
||||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_968, quirk_s3_64M );
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_968, quirk_s3_64M );
|
||||||
|
|
||||||
static void __devinit quirk_io_region(struct pci_dev *dev, unsigned region, unsigned size, int nr)
|
static void __devinit quirk_io_region(struct pci_dev *dev, unsigned region,
|
||||||
|
unsigned size, int nr, const char *name)
|
||||||
{
|
{
|
||||||
region &= ~(size-1);
|
region &= ~(size-1);
|
||||||
if (region) {
|
if (region) {
|
||||||
|
@ -259,6 +260,7 @@ static void __devinit quirk_io_region(struct pci_dev *dev, unsigned region, unsi
|
||||||
pcibios_bus_to_resource(dev, res, &bus_region);
|
pcibios_bus_to_resource(dev, res, &bus_region);
|
||||||
|
|
||||||
pci_claim_resource(dev, nr);
|
pci_claim_resource(dev, nr);
|
||||||
|
printk("PCI quirk: region %04x-%04x claimed by %s\n", region, region + size - 1, name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -291,25 +293,98 @@ static void __devinit quirk_ali7101_acpi(struct pci_dev *dev)
|
||||||
u16 region;
|
u16 region;
|
||||||
|
|
||||||
pci_read_config_word(dev, 0xE0, ®ion);
|
pci_read_config_word(dev, 0xE0, ®ion);
|
||||||
quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES);
|
quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES, "ali7101 ACPI");
|
||||||
pci_read_config_word(dev, 0xE2, ®ion);
|
pci_read_config_word(dev, 0xE2, ®ion);
|
||||||
quirk_io_region(dev, region, 32, PCI_BRIDGE_RESOURCES+1);
|
quirk_io_region(dev, region, 32, PCI_BRIDGE_RESOURCES+1, "ali7101 SMB");
|
||||||
}
|
}
|
||||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101, quirk_ali7101_acpi );
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101, quirk_ali7101_acpi );
|
||||||
|
|
||||||
|
static void piix4_io_quirk(struct pci_dev *dev, const char *name, unsigned int port, unsigned int enable)
|
||||||
|
{
|
||||||
|
u32 devres;
|
||||||
|
u32 mask, size, base;
|
||||||
|
|
||||||
|
pci_read_config_dword(dev, port, &devres);
|
||||||
|
if ((devres & enable) != enable)
|
||||||
|
return;
|
||||||
|
mask = (devres >> 16) & 15;
|
||||||
|
base = devres & 0xffff;
|
||||||
|
size = 16;
|
||||||
|
for (;;) {
|
||||||
|
unsigned bit = size >> 1;
|
||||||
|
if ((bit & mask) == bit)
|
||||||
|
break;
|
||||||
|
size = bit;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* For now we only print it out. Eventually we'll want to
|
||||||
|
* reserve it (at least if it's in the 0x1000+ range), but
|
||||||
|
* let's get enough confirmation reports first.
|
||||||
|
*/
|
||||||
|
base &= -size;
|
||||||
|
printk("%s PIO at %04x-%04x\n", name, base, base + size - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void piix4_mem_quirk(struct pci_dev *dev, const char *name, unsigned int port, unsigned int enable)
|
||||||
|
{
|
||||||
|
u32 devres;
|
||||||
|
u32 mask, size, base;
|
||||||
|
|
||||||
|
pci_read_config_dword(dev, port, &devres);
|
||||||
|
if ((devres & enable) != enable)
|
||||||
|
return;
|
||||||
|
base = devres & 0xffff0000;
|
||||||
|
mask = (devres & 0x3f) << 16;
|
||||||
|
size = 128 << 16;
|
||||||
|
for (;;) {
|
||||||
|
unsigned bit = size >> 1;
|
||||||
|
if ((bit & mask) == bit)
|
||||||
|
break;
|
||||||
|
size = bit;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* For now we only print it out. Eventually we'll want to
|
||||||
|
* reserve it, but let's get enough confirmation reports first.
|
||||||
|
*/
|
||||||
|
base &= -size;
|
||||||
|
printk("%s MMIO at %04x-%04x\n", name, base, base + size - 1);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* PIIX4 ACPI: Two IO regions pointed to by longwords at
|
* PIIX4 ACPI: Two IO regions pointed to by longwords at
|
||||||
* 0x40 (64 bytes of ACPI registers)
|
* 0x40 (64 bytes of ACPI registers)
|
||||||
* 0x90 (32 bytes of SMB registers)
|
* 0x90 (32 bytes of SMB registers)
|
||||||
|
* and a few strange programmable PIIX4 device resources.
|
||||||
*/
|
*/
|
||||||
static void __devinit quirk_piix4_acpi(struct pci_dev *dev)
|
static void __devinit quirk_piix4_acpi(struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
u32 region;
|
u32 region, res_a;
|
||||||
|
|
||||||
pci_read_config_dword(dev, 0x40, ®ion);
|
pci_read_config_dword(dev, 0x40, ®ion);
|
||||||
quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES);
|
quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES, "PIIX4 ACPI");
|
||||||
pci_read_config_dword(dev, 0x90, ®ion);
|
pci_read_config_dword(dev, 0x90, ®ion);
|
||||||
quirk_io_region(dev, region, 32, PCI_BRIDGE_RESOURCES+1);
|
quirk_io_region(dev, region, 32, PCI_BRIDGE_RESOURCES+1, "PIIX4 SMB");
|
||||||
|
|
||||||
|
/* Device resource A has enables for some of the other ones */
|
||||||
|
pci_read_config_dword(dev, 0x5c, &res_a);
|
||||||
|
|
||||||
|
piix4_io_quirk(dev, "PIIX4 devres B", 0x60, 3 << 21);
|
||||||
|
piix4_io_quirk(dev, "PIIX4 devres C", 0x64, 3 << 21);
|
||||||
|
|
||||||
|
/* Device resource D is just bitfields for static resources */
|
||||||
|
|
||||||
|
/* Device 12 enabled? */
|
||||||
|
if (res_a & (1 << 29)) {
|
||||||
|
piix4_io_quirk(dev, "PIIX4 devres E", 0x68, 1 << 20);
|
||||||
|
piix4_mem_quirk(dev, "PIIX4 devres F", 0x6c, 1 << 7);
|
||||||
|
}
|
||||||
|
/* Device 13 enabled? */
|
||||||
|
if (res_a & (1 << 30)) {
|
||||||
|
piix4_io_quirk(dev, "PIIX4 devres G", 0x70, 1 << 20);
|
||||||
|
piix4_mem_quirk(dev, "PIIX4 devres H", 0x74, 1 << 7);
|
||||||
|
}
|
||||||
|
piix4_io_quirk(dev, "PIIX4 devres I", 0x78, 1 << 20);
|
||||||
|
piix4_io_quirk(dev, "PIIX4 devres J", 0x7c, 1 << 20);
|
||||||
}
|
}
|
||||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, quirk_piix4_acpi );
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, quirk_piix4_acpi );
|
||||||
|
|
||||||
|
@ -323,10 +398,10 @@ static void __devinit quirk_ich4_lpc_acpi(struct pci_dev *dev)
|
||||||
u32 region;
|
u32 region;
|
||||||
|
|
||||||
pci_read_config_dword(dev, 0x40, ®ion);
|
pci_read_config_dword(dev, 0x40, ®ion);
|
||||||
quirk_io_region(dev, region, 128, PCI_BRIDGE_RESOURCES);
|
quirk_io_region(dev, region, 128, PCI_BRIDGE_RESOURCES, "ICH4 ACPI/GPIO/TCO");
|
||||||
|
|
||||||
pci_read_config_dword(dev, 0x58, ®ion);
|
pci_read_config_dword(dev, 0x58, ®ion);
|
||||||
quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES+1);
|
quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES+1, "ICH4 GPIO");
|
||||||
}
|
}
|
||||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_0, quirk_ich4_lpc_acpi );
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_0, quirk_ich4_lpc_acpi );
|
||||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_0, quirk_ich4_lpc_acpi );
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_0, quirk_ich4_lpc_acpi );
|
||||||
|
@ -352,7 +427,7 @@ static void __devinit quirk_vt82c586_acpi(struct pci_dev *dev)
|
||||||
if (rev & 0x10) {
|
if (rev & 0x10) {
|
||||||
pci_read_config_dword(dev, 0x48, ®ion);
|
pci_read_config_dword(dev, 0x48, ®ion);
|
||||||
region &= PCI_BASE_ADDRESS_IO_MASK;
|
region &= PCI_BASE_ADDRESS_IO_MASK;
|
||||||
quirk_io_region(dev, region, 256, PCI_BRIDGE_RESOURCES);
|
quirk_io_region(dev, region, 256, PCI_BRIDGE_RESOURCES, "vt82c586 ACPI");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_vt82c586_acpi );
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_vt82c586_acpi );
|
||||||
|
@ -372,11 +447,11 @@ static void __devinit quirk_vt82c686_acpi(struct pci_dev *dev)
|
||||||
|
|
||||||
pci_read_config_word(dev, 0x70, &hm);
|
pci_read_config_word(dev, 0x70, &hm);
|
||||||
hm &= PCI_BASE_ADDRESS_IO_MASK;
|
hm &= PCI_BASE_ADDRESS_IO_MASK;
|
||||||
quirk_io_region(dev, hm, 128, PCI_BRIDGE_RESOURCES + 1);
|
quirk_io_region(dev, hm, 128, PCI_BRIDGE_RESOURCES + 1, "vt82c868 HW-mon");
|
||||||
|
|
||||||
pci_read_config_dword(dev, 0x90, &smb);
|
pci_read_config_dword(dev, 0x90, &smb);
|
||||||
smb &= PCI_BASE_ADDRESS_IO_MASK;
|
smb &= PCI_BASE_ADDRESS_IO_MASK;
|
||||||
quirk_io_region(dev, smb, 16, PCI_BRIDGE_RESOURCES + 2);
|
quirk_io_region(dev, smb, 16, PCI_BRIDGE_RESOURCES + 2, "vt82c868 SMB");
|
||||||
}
|
}
|
||||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_vt82c686_acpi );
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_vt82c686_acpi );
|
||||||
|
|
||||||
|
@ -391,11 +466,11 @@ static void __devinit quirk_vt8235_acpi(struct pci_dev *dev)
|
||||||
|
|
||||||
pci_read_config_word(dev, 0x88, &pm);
|
pci_read_config_word(dev, 0x88, &pm);
|
||||||
pm &= PCI_BASE_ADDRESS_IO_MASK;
|
pm &= PCI_BASE_ADDRESS_IO_MASK;
|
||||||
quirk_io_region(dev, pm, 128, PCI_BRIDGE_RESOURCES);
|
quirk_io_region(dev, pm, 128, PCI_BRIDGE_RESOURCES, "vt8235 PM");
|
||||||
|
|
||||||
pci_read_config_word(dev, 0xd0, &smb);
|
pci_read_config_word(dev, 0xd0, &smb);
|
||||||
smb &= PCI_BASE_ADDRESS_IO_MASK;
|
smb &= PCI_BASE_ADDRESS_IO_MASK;
|
||||||
quirk_io_region(dev, smb, 16, PCI_BRIDGE_RESOURCES + 1);
|
quirk_io_region(dev, smb, 16, PCI_BRIDGE_RESOURCES + 1, "vt8235 SMB");
|
||||||
}
|
}
|
||||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, quirk_vt8235_acpi);
|
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, quirk_vt8235_acpi);
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@
|
||||||
* FIXME: IO should be max 256 bytes. However, since we may
|
* FIXME: IO should be max 256 bytes. However, since we may
|
||||||
* have a P2P bridge below a cardbus bridge, we need 4K.
|
* have a P2P bridge below a cardbus bridge, we need 4K.
|
||||||
*/
|
*/
|
||||||
#define CARDBUS_IO_SIZE (4*1024)
|
#define CARDBUS_IO_SIZE (256)
|
||||||
#define CARDBUS_MEM_SIZE (32*1024*1024)
|
#define CARDBUS_MEM_SIZE (32*1024*1024)
|
||||||
|
|
||||||
static void __devinit
|
static void __devinit
|
||||||
|
|
|
@ -91,7 +91,7 @@
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG
|
||||||
#define NDEBUG 0
|
#define NDEBUG 0
|
||||||
#endif
|
#endif
|
||||||
#ifndef NDEBUG
|
#ifndef NDEBUG_ABORT
|
||||||
#define NDEBUG_ABORT 0
|
#define NDEBUG_ABORT 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#define AAC_MAX_LUN (8)
|
#define AAC_MAX_LUN (8)
|
||||||
|
|
||||||
#define AAC_MAX_HOSTPHYSMEMPAGES (0xfffff)
|
#define AAC_MAX_HOSTPHYSMEMPAGES (0xfffff)
|
||||||
#define AAC_MAX_32BIT_SGBCOUNT ((unsigned short)512)
|
#define AAC_MAX_32BIT_SGBCOUNT ((unsigned short)256)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* These macros convert from physical channels to virtual channels
|
* These macros convert from physical channels to virtual channels
|
||||||
|
|
|
@ -1325,6 +1325,8 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
|
||||||
ha->brd_info = brd_info;
|
ha->brd_info = brd_info;
|
||||||
sprintf(ha->host_str, "%s_%ld", ha->brd_info->drv_name, ha->host_no);
|
sprintf(ha->host_str, "%s_%ld", ha->brd_info->drv_name, ha->host_no);
|
||||||
|
|
||||||
|
ha->dpc_pid = -1;
|
||||||
|
|
||||||
/* Configure PCI I/O space */
|
/* Configure PCI I/O space */
|
||||||
ret = qla2x00_iospace_config(ha);
|
ret = qla2x00_iospace_config(ha);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -1448,7 +1450,6 @@ int qla2x00_probe_one(struct pci_dev *pdev, struct qla_board_info *brd_info)
|
||||||
*/
|
*/
|
||||||
spin_lock_init(&ha->mbx_reg_lock);
|
spin_lock_init(&ha->mbx_reg_lock);
|
||||||
|
|
||||||
ha->dpc_pid = -1;
|
|
||||||
init_completion(&ha->dpc_inited);
|
init_completion(&ha->dpc_inited);
|
||||||
init_completion(&ha->dpc_exited);
|
init_completion(&ha->dpc_exited);
|
||||||
|
|
||||||
|
|
|
@ -185,6 +185,7 @@ static struct {
|
||||||
{"PIONEER", "CD-ROM DRM-600", NULL, BLIST_FORCELUN | BLIST_SINGLELUN},
|
{"PIONEER", "CD-ROM DRM-600", NULL, BLIST_FORCELUN | BLIST_SINGLELUN},
|
||||||
{"PIONEER", "CD-ROM DRM-602X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN},
|
{"PIONEER", "CD-ROM DRM-602X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN},
|
||||||
{"PIONEER", "CD-ROM DRM-604X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN},
|
{"PIONEER", "CD-ROM DRM-604X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN},
|
||||||
|
{"PIONEER", "CD-ROM DRM-624X", NULL, BLIST_FORCELUN | BLIST_SINGLELUN},
|
||||||
{"REGAL", "CDC-4X", NULL, BLIST_MAX5LUN | BLIST_SINGLELUN},
|
{"REGAL", "CDC-4X", NULL, BLIST_MAX5LUN | BLIST_SINGLELUN},
|
||||||
{"SanDisk", "ImageMate CF-SD1", NULL, BLIST_FORCELUN},
|
{"SanDisk", "ImageMate CF-SD1", NULL, BLIST_FORCELUN},
|
||||||
{"SEAGATE", "ST34555N", "0930", BLIST_NOTQ}, /* Chokes on tagged INQUIRY */
|
{"SEAGATE", "ST34555N", "0930", BLIST_NOTQ}, /* Chokes on tagged INQUIRY */
|
||||||
|
|
|
@ -97,7 +97,6 @@ int scsi_insert_special_req(struct scsi_request *sreq, int at_head)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void scsi_run_queue(struct request_queue *q);
|
static void scsi_run_queue(struct request_queue *q);
|
||||||
static void scsi_release_buffers(struct scsi_cmnd *cmd);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Function: scsi_unprep_request()
|
* Function: scsi_unprep_request()
|
||||||
|
@ -1040,8 +1039,10 @@ static int scsi_init_io(struct scsi_cmnd *cmd)
|
||||||
* if sg table allocation fails, requeue request later.
|
* if sg table allocation fails, requeue request later.
|
||||||
*/
|
*/
|
||||||
sgpnt = scsi_alloc_sgtable(cmd, GFP_ATOMIC);
|
sgpnt = scsi_alloc_sgtable(cmd, GFP_ATOMIC);
|
||||||
if (unlikely(!sgpnt))
|
if (unlikely(!sgpnt)) {
|
||||||
|
scsi_unprep_request(req);
|
||||||
return BLKPREP_DEFER;
|
return BLKPREP_DEFER;
|
||||||
|
}
|
||||||
|
|
||||||
cmd->request_buffer = (char *) sgpnt;
|
cmd->request_buffer = (char *) sgpnt;
|
||||||
cmd->request_bufflen = req->nr_sectors << 9;
|
cmd->request_bufflen = req->nr_sectors << 9;
|
||||||
|
@ -1245,8 +1246,8 @@ static int scsi_prep_fn(struct request_queue *q, struct request *req)
|
||||||
*/
|
*/
|
||||||
ret = scsi_init_io(cmd);
|
ret = scsi_init_io(cmd);
|
||||||
switch(ret) {
|
switch(ret) {
|
||||||
|
/* For BLKPREP_KILL/DEFER the cmd was released */
|
||||||
case BLKPREP_KILL:
|
case BLKPREP_KILL:
|
||||||
/* BLKPREP_KILL return also releases the command */
|
|
||||||
goto kill;
|
goto kill;
|
||||||
case BLKPREP_DEFER:
|
case BLKPREP_DEFER:
|
||||||
goto defer;
|
goto defer;
|
||||||
|
|
|
@ -819,12 +819,15 @@ show_fc_private_host_tgtid_bind_type(struct class_device *cdev, char *buf)
|
||||||
return snprintf(buf, FC_BINDTYPE_MAX_NAMELEN, "%s\n", name);
|
return snprintf(buf, FC_BINDTYPE_MAX_NAMELEN, "%s\n", name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define get_list_head_entry(pos, head, member) \
|
||||||
|
pos = list_entry((head)->next, typeof(*pos), member)
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
store_fc_private_host_tgtid_bind_type(struct class_device *cdev,
|
store_fc_private_host_tgtid_bind_type(struct class_device *cdev,
|
||||||
const char *buf, size_t count)
|
const char *buf, size_t count)
|
||||||
{
|
{
|
||||||
struct Scsi_Host *shost = transport_class_to_shost(cdev);
|
struct Scsi_Host *shost = transport_class_to_shost(cdev);
|
||||||
struct fc_rport *rport, *next_rport;
|
struct fc_rport *rport;
|
||||||
enum fc_tgtid_binding_type val;
|
enum fc_tgtid_binding_type val;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
|
@ -834,9 +837,13 @@ store_fc_private_host_tgtid_bind_type(struct class_device *cdev,
|
||||||
/* if changing bind type, purge all unused consistent bindings */
|
/* if changing bind type, purge all unused consistent bindings */
|
||||||
if (val != fc_host_tgtid_bind_type(shost)) {
|
if (val != fc_host_tgtid_bind_type(shost)) {
|
||||||
spin_lock_irqsave(shost->host_lock, flags);
|
spin_lock_irqsave(shost->host_lock, flags);
|
||||||
list_for_each_entry_safe(rport, next_rport,
|
while (!list_empty(&fc_host_rport_bindings(shost))) {
|
||||||
&fc_host_rport_bindings(shost), peers)
|
get_list_head_entry(rport,
|
||||||
|
&fc_host_rport_bindings(shost), peers);
|
||||||
|
spin_unlock_irqrestore(shost->host_lock, flags);
|
||||||
fc_rport_terminate(rport);
|
fc_rport_terminate(rport);
|
||||||
|
spin_lock_irqsave(shost->host_lock, flags);
|
||||||
|
}
|
||||||
spin_unlock_irqrestore(shost->host_lock, flags);
|
spin_unlock_irqrestore(shost->host_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -152,6 +152,7 @@ static int __devinit pci_hp_diva_init(struct pci_dev *dev)
|
||||||
rc = 4;
|
rc = 4;
|
||||||
break;
|
break;
|
||||||
case PCI_DEVICE_ID_HP_DIVA_POWERBAR:
|
case PCI_DEVICE_ID_HP_DIVA_POWERBAR:
|
||||||
|
case PCI_DEVICE_ID_HP_DIVA_HURRICANE:
|
||||||
rc = 1;
|
rc = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -226,8 +227,10 @@ static int __devinit pci_plx9050_init(struct pci_dev *dev)
|
||||||
}
|
}
|
||||||
|
|
||||||
irq_config = 0x41;
|
irq_config = 0x41;
|
||||||
if (dev->vendor == PCI_VENDOR_ID_PANACOM)
|
if (dev->vendor == PCI_VENDOR_ID_PANACOM ||
|
||||||
|
dev->subsystem_vendor == PCI_SUBVENDOR_ID_EXSYS) {
|
||||||
irq_config = 0x43;
|
irq_config = 0x43;
|
||||||
|
}
|
||||||
if ((dev->vendor == PCI_VENDOR_ID_PLX) &&
|
if ((dev->vendor == PCI_VENDOR_ID_PLX) &&
|
||||||
(dev->device == PCI_DEVICE_ID_PLX_ROMULUS)) {
|
(dev->device == PCI_DEVICE_ID_PLX_ROMULUS)) {
|
||||||
/*
|
/*
|
||||||
|
@ -661,6 +664,15 @@ static struct pci_serial_quirk pci_serial_quirks[] = {
|
||||||
/*
|
/*
|
||||||
* PLX
|
* PLX
|
||||||
*/
|
*/
|
||||||
|
{
|
||||||
|
.vendor = PCI_VENDOR_ID_PLX,
|
||||||
|
.device = PCI_DEVICE_ID_PLX_9050,
|
||||||
|
.subvendor = PCI_SUBVENDOR_ID_EXSYS,
|
||||||
|
.subdevice = PCI_SUBDEVICE_ID_EXSYS_4055,
|
||||||
|
.init = pci_plx9050_init,
|
||||||
|
.setup = pci_default_setup,
|
||||||
|
.exit = __devexit_p(pci_plx9050_exit),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
.vendor = PCI_VENDOR_ID_PLX,
|
.vendor = PCI_VENDOR_ID_PLX,
|
||||||
.device = PCI_DEVICE_ID_PLX_9050,
|
.device = PCI_DEVICE_ID_PLX_9050,
|
||||||
|
@ -927,6 +939,7 @@ enum pci_board_num_t {
|
||||||
pbn_panacom,
|
pbn_panacom,
|
||||||
pbn_panacom2,
|
pbn_panacom2,
|
||||||
pbn_panacom4,
|
pbn_panacom4,
|
||||||
|
pbn_exsys_4055,
|
||||||
pbn_plx_romulus,
|
pbn_plx_romulus,
|
||||||
pbn_oxsemi,
|
pbn_oxsemi,
|
||||||
pbn_intel_i960,
|
pbn_intel_i960,
|
||||||
|
@ -1292,6 +1305,13 @@ static struct pciserial_board pci_boards[] __devinitdata = {
|
||||||
.reg_shift = 7,
|
.reg_shift = 7,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
[pbn_exsys_4055] = {
|
||||||
|
.flags = FL_BASE2,
|
||||||
|
.num_ports = 4,
|
||||||
|
.base_baud = 115200,
|
||||||
|
.uart_offset = 8,
|
||||||
|
},
|
||||||
|
|
||||||
/* I think this entry is broken - the first_offset looks wrong --rmk */
|
/* I think this entry is broken - the first_offset looks wrong --rmk */
|
||||||
[pbn_plx_romulus] = {
|
[pbn_plx_romulus] = {
|
||||||
.flags = FL_BASE2,
|
.flags = FL_BASE2,
|
||||||
|
@ -1853,6 +1873,10 @@ static struct pci_device_id serial_pci_tbl[] = {
|
||||||
PCI_SUBVENDOR_ID_CHASE_PCIRAS,
|
PCI_SUBVENDOR_ID_CHASE_PCIRAS,
|
||||||
PCI_SUBDEVICE_ID_CHASE_PCIRAS8, 0, 0,
|
PCI_SUBDEVICE_ID_CHASE_PCIRAS8, 0, 0,
|
||||||
pbn_b2_8_460800 },
|
pbn_b2_8_460800 },
|
||||||
|
{ PCI_VENDOR_ID_PLX, PCI_DEVICE_ID_PLX_9050,
|
||||||
|
PCI_SUBVENDOR_ID_EXSYS,
|
||||||
|
PCI_SUBDEVICE_ID_EXSYS_4055, 0, 0,
|
||||||
|
pbn_exsys_4055 },
|
||||||
/*
|
/*
|
||||||
* Megawolf Romulus PCI Serial Card, from Mike Hudson
|
* Megawolf Romulus PCI Serial Card, from Mike Hudson
|
||||||
* (Exoray@isys.ca)
|
* (Exoray@isys.ca)
|
||||||
|
|
|
@ -242,6 +242,13 @@ static ssize_t show_virtual(struct class_device *class_device, char *buf)
|
||||||
fb_info->var.yres_virtual);
|
fb_info->var.yres_virtual);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ssize_t show_stride(struct class_device *class_device, char *buf)
|
||||||
|
{
|
||||||
|
struct fb_info *fb_info =
|
||||||
|
(struct fb_info *)class_get_devdata(class_device);
|
||||||
|
return snprintf(buf, PAGE_SIZE, "%d\n", fb_info->fix.line_length);
|
||||||
|
}
|
||||||
|
|
||||||
/* Format for cmap is "%02x%c%4x%4x%4x\n" */
|
/* Format for cmap is "%02x%c%4x%4x%4x\n" */
|
||||||
/* %02x entry %c transp %4x red %4x blue %4x green \n */
|
/* %02x entry %c transp %4x red %4x blue %4x green \n */
|
||||||
/* 256 rows at 16 chars equals 4096, the normal page size */
|
/* 256 rows at 16 chars equals 4096, the normal page size */
|
||||||
|
@ -432,6 +439,7 @@ static struct class_device_attribute class_device_attrs[] = {
|
||||||
__ATTR(pan, S_IRUGO|S_IWUSR, show_pan, store_pan),
|
__ATTR(pan, S_IRUGO|S_IWUSR, show_pan, store_pan),
|
||||||
__ATTR(virtual_size, S_IRUGO|S_IWUSR, show_virtual, store_virtual),
|
__ATTR(virtual_size, S_IRUGO|S_IWUSR, show_virtual, store_virtual),
|
||||||
__ATTR(name, S_IRUGO, show_name, NULL),
|
__ATTR(name, S_IRUGO, show_name, NULL),
|
||||||
|
__ATTR(stride, S_IRUGO, show_stride, NULL),
|
||||||
};
|
};
|
||||||
|
|
||||||
int fb_init_class_device(struct fb_info *fb_info)
|
int fb_init_class_device(struct fb_info *fb_info)
|
||||||
|
|
6
fs/aio.c
6
fs/aio.c
|
@ -1397,6 +1397,9 @@ static ssize_t aio_setup_iocb(struct kiocb *kiocb)
|
||||||
if (unlikely(!access_ok(VERIFY_WRITE, kiocb->ki_buf,
|
if (unlikely(!access_ok(VERIFY_WRITE, kiocb->ki_buf,
|
||||||
kiocb->ki_left)))
|
kiocb->ki_left)))
|
||||||
break;
|
break;
|
||||||
|
ret = security_file_permission(file, MAY_READ);
|
||||||
|
if (unlikely(ret))
|
||||||
|
break;
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
if (file->f_op->aio_read)
|
if (file->f_op->aio_read)
|
||||||
kiocb->ki_retry = aio_pread;
|
kiocb->ki_retry = aio_pread;
|
||||||
|
@ -1409,6 +1412,9 @@ static ssize_t aio_setup_iocb(struct kiocb *kiocb)
|
||||||
if (unlikely(!access_ok(VERIFY_READ, kiocb->ki_buf,
|
if (unlikely(!access_ok(VERIFY_READ, kiocb->ki_buf,
|
||||||
kiocb->ki_left)))
|
kiocb->ki_left)))
|
||||||
break;
|
break;
|
||||||
|
ret = security_file_permission(file, MAY_WRITE);
|
||||||
|
if (unlikely(ret))
|
||||||
|
break;
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
if (file->f_op->aio_write)
|
if (file->f_op->aio_write)
|
||||||
kiocb->ki_retry = aio_pwrite;
|
kiocb->ki_retry = aio_pwrite;
|
||||||
|
|
|
@ -50,6 +50,7 @@ static void hfsplus_read_inode(struct inode *inode)
|
||||||
init_MUTEX(&HFSPLUS_I(inode).extents_lock);
|
init_MUTEX(&HFSPLUS_I(inode).extents_lock);
|
||||||
HFSPLUS_I(inode).flags = 0;
|
HFSPLUS_I(inode).flags = 0;
|
||||||
HFSPLUS_I(inode).rsrc_inode = NULL;
|
HFSPLUS_I(inode).rsrc_inode = NULL;
|
||||||
|
atomic_set(&HFSPLUS_I(inode).opencnt, 0);
|
||||||
|
|
||||||
if (inode->i_ino >= HFSPLUS_FIRSTUSER_CNID) {
|
if (inode->i_ino >= HFSPLUS_FIRSTUSER_CNID) {
|
||||||
read_inode:
|
read_inode:
|
||||||
|
|
|
@ -176,6 +176,7 @@ static inline void put_inotify_dev(struct inotify_device *dev)
|
||||||
if (atomic_dec_and_test(&dev->count)) {
|
if (atomic_dec_and_test(&dev->count)) {
|
||||||
atomic_dec(&dev->user->inotify_devs);
|
atomic_dec(&dev->user->inotify_devs);
|
||||||
free_uid(dev->user);
|
free_uid(dev->user);
|
||||||
|
idr_destroy(&dev->idr);
|
||||||
kfree(dev);
|
kfree(dev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
#ifndef _ALPHA_ATOMIC_H
|
#ifndef _ALPHA_ATOMIC_H
|
||||||
#define _ALPHA_ATOMIC_H
|
#define _ALPHA_ATOMIC_H
|
||||||
|
|
||||||
|
#include <asm/barrier.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Atomic operations that C can't guarantee us. Useful for
|
* Atomic operations that C can't guarantee us. Useful for
|
||||||
* resource counting etc...
|
* resource counting etc...
|
||||||
|
@ -100,18 +102,19 @@ static __inline__ void atomic64_sub(long i, atomic64_t * v)
|
||||||
static __inline__ long atomic_add_return(int i, atomic_t * v)
|
static __inline__ long atomic_add_return(int i, atomic_t * v)
|
||||||
{
|
{
|
||||||
long temp, result;
|
long temp, result;
|
||||||
|
smp_mb();
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
"1: ldl_l %0,%1\n"
|
"1: ldl_l %0,%1\n"
|
||||||
" addl %0,%3,%2\n"
|
" addl %0,%3,%2\n"
|
||||||
" addl %0,%3,%0\n"
|
" addl %0,%3,%0\n"
|
||||||
" stl_c %0,%1\n"
|
" stl_c %0,%1\n"
|
||||||
" beq %0,2f\n"
|
" beq %0,2f\n"
|
||||||
" mb\n"
|
|
||||||
".subsection 2\n"
|
".subsection 2\n"
|
||||||
"2: br 1b\n"
|
"2: br 1b\n"
|
||||||
".previous"
|
".previous"
|
||||||
:"=&r" (temp), "=m" (v->counter), "=&r" (result)
|
:"=&r" (temp), "=m" (v->counter), "=&r" (result)
|
||||||
:"Ir" (i), "m" (v->counter) : "memory");
|
:"Ir" (i), "m" (v->counter) : "memory");
|
||||||
|
smp_mb();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,54 +123,57 @@ static __inline__ long atomic_add_return(int i, atomic_t * v)
|
||||||
static __inline__ long atomic64_add_return(long i, atomic64_t * v)
|
static __inline__ long atomic64_add_return(long i, atomic64_t * v)
|
||||||
{
|
{
|
||||||
long temp, result;
|
long temp, result;
|
||||||
|
smp_mb();
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
"1: ldq_l %0,%1\n"
|
"1: ldq_l %0,%1\n"
|
||||||
" addq %0,%3,%2\n"
|
" addq %0,%3,%2\n"
|
||||||
" addq %0,%3,%0\n"
|
" addq %0,%3,%0\n"
|
||||||
" stq_c %0,%1\n"
|
" stq_c %0,%1\n"
|
||||||
" beq %0,2f\n"
|
" beq %0,2f\n"
|
||||||
" mb\n"
|
|
||||||
".subsection 2\n"
|
".subsection 2\n"
|
||||||
"2: br 1b\n"
|
"2: br 1b\n"
|
||||||
".previous"
|
".previous"
|
||||||
:"=&r" (temp), "=m" (v->counter), "=&r" (result)
|
:"=&r" (temp), "=m" (v->counter), "=&r" (result)
|
||||||
:"Ir" (i), "m" (v->counter) : "memory");
|
:"Ir" (i), "m" (v->counter) : "memory");
|
||||||
|
smp_mb();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __inline__ long atomic_sub_return(int i, atomic_t * v)
|
static __inline__ long atomic_sub_return(int i, atomic_t * v)
|
||||||
{
|
{
|
||||||
long temp, result;
|
long temp, result;
|
||||||
|
smp_mb();
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
"1: ldl_l %0,%1\n"
|
"1: ldl_l %0,%1\n"
|
||||||
" subl %0,%3,%2\n"
|
" subl %0,%3,%2\n"
|
||||||
" subl %0,%3,%0\n"
|
" subl %0,%3,%0\n"
|
||||||
" stl_c %0,%1\n"
|
" stl_c %0,%1\n"
|
||||||
" beq %0,2f\n"
|
" beq %0,2f\n"
|
||||||
" mb\n"
|
|
||||||
".subsection 2\n"
|
".subsection 2\n"
|
||||||
"2: br 1b\n"
|
"2: br 1b\n"
|
||||||
".previous"
|
".previous"
|
||||||
:"=&r" (temp), "=m" (v->counter), "=&r" (result)
|
:"=&r" (temp), "=m" (v->counter), "=&r" (result)
|
||||||
:"Ir" (i), "m" (v->counter) : "memory");
|
:"Ir" (i), "m" (v->counter) : "memory");
|
||||||
|
smp_mb();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __inline__ long atomic64_sub_return(long i, atomic64_t * v)
|
static __inline__ long atomic64_sub_return(long i, atomic64_t * v)
|
||||||
{
|
{
|
||||||
long temp, result;
|
long temp, result;
|
||||||
|
smp_mb();
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
"1: ldq_l %0,%1\n"
|
"1: ldq_l %0,%1\n"
|
||||||
" subq %0,%3,%2\n"
|
" subq %0,%3,%2\n"
|
||||||
" subq %0,%3,%0\n"
|
" subq %0,%3,%0\n"
|
||||||
" stq_c %0,%1\n"
|
" stq_c %0,%1\n"
|
||||||
" beq %0,2f\n"
|
" beq %0,2f\n"
|
||||||
" mb\n"
|
|
||||||
".subsection 2\n"
|
".subsection 2\n"
|
||||||
"2: br 1b\n"
|
"2: br 1b\n"
|
||||||
".previous"
|
".previous"
|
||||||
:"=&r" (temp), "=m" (v->counter), "=&r" (result)
|
:"=&r" (temp), "=m" (v->counter), "=&r" (result)
|
||||||
:"Ir" (i), "m" (v->counter) : "memory");
|
:"Ir" (i), "m" (v->counter) : "memory");
|
||||||
|
smp_mb();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
#ifndef __BARRIER_H
|
||||||
|
#define __BARRIER_H
|
||||||
|
|
||||||
|
#define mb() \
|
||||||
|
__asm__ __volatile__("mb": : :"memory")
|
||||||
|
|
||||||
|
#define rmb() \
|
||||||
|
__asm__ __volatile__("mb": : :"memory")
|
||||||
|
|
||||||
|
#define wmb() \
|
||||||
|
__asm__ __volatile__("wmb": : :"memory")
|
||||||
|
|
||||||
|
#define read_barrier_depends() \
|
||||||
|
__asm__ __volatile__("mb": : :"memory")
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
#define smp_mb() mb()
|
||||||
|
#define smp_rmb() rmb()
|
||||||
|
#define smp_wmb() wmb()
|
||||||
|
#define smp_read_barrier_depends() read_barrier_depends()
|
||||||
|
#else
|
||||||
|
#define smp_mb() barrier()
|
||||||
|
#define smp_rmb() barrier()
|
||||||
|
#define smp_wmb() barrier()
|
||||||
|
#define smp_read_barrier_depends() barrier()
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define set_mb(var, value) \
|
||||||
|
do { var = value; mb(); } while (0)
|
||||||
|
|
||||||
|
#define set_wmb(var, value) \
|
||||||
|
do { var = value; wmb(); } while (0)
|
||||||
|
|
||||||
|
#endif /* __BARRIER_H */
|
|
@ -4,6 +4,7 @@
|
||||||
#include <linux/config.h>
|
#include <linux/config.h>
|
||||||
#include <asm/pal.h>
|
#include <asm/pal.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
#include <asm/barrier.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* System defines.. Note that this is included both from .c and .S
|
* System defines.. Note that this is included both from .c and .S
|
||||||
|
@ -139,36 +140,6 @@ extern void halt(void) __attribute__((noreturn));
|
||||||
struct task_struct;
|
struct task_struct;
|
||||||
extern struct task_struct *alpha_switch_to(unsigned long, struct task_struct*);
|
extern struct task_struct *alpha_switch_to(unsigned long, struct task_struct*);
|
||||||
|
|
||||||
#define mb() \
|
|
||||||
__asm__ __volatile__("mb": : :"memory")
|
|
||||||
|
|
||||||
#define rmb() \
|
|
||||||
__asm__ __volatile__("mb": : :"memory")
|
|
||||||
|
|
||||||
#define wmb() \
|
|
||||||
__asm__ __volatile__("wmb": : :"memory")
|
|
||||||
|
|
||||||
#define read_barrier_depends() \
|
|
||||||
__asm__ __volatile__("mb": : :"memory")
|
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
|
||||||
#define smp_mb() mb()
|
|
||||||
#define smp_rmb() rmb()
|
|
||||||
#define smp_wmb() wmb()
|
|
||||||
#define smp_read_barrier_depends() read_barrier_depends()
|
|
||||||
#else
|
|
||||||
#define smp_mb() barrier()
|
|
||||||
#define smp_rmb() barrier()
|
|
||||||
#define smp_wmb() barrier()
|
|
||||||
#define smp_read_barrier_depends() barrier()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define set_mb(var, value) \
|
|
||||||
do { var = value; mb(); } while (0)
|
|
||||||
|
|
||||||
#define set_wmb(var, value) \
|
|
||||||
do { var = value; wmb(); } while (0)
|
|
||||||
|
|
||||||
#define imb() \
|
#define imb() \
|
||||||
__asm__ __volatile__ ("call_pal %0 #imb" : : "i" (PAL_imb) : "memory")
|
__asm__ __volatile__ ("call_pal %0 #imb" : : "i" (PAL_imb) : "memory")
|
||||||
|
|
||||||
|
|
|
@ -347,7 +347,6 @@ static inline unsigned long __ffs(unsigned long word)
|
||||||
* the clz instruction for much better code efficiency.
|
* the clz instruction for much better code efficiency.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static __inline__ int generic_fls(int x);
|
|
||||||
#define fls(x) \
|
#define fls(x) \
|
||||||
( __builtin_constant_p(x) ? generic_fls(x) : \
|
( __builtin_constant_p(x) ? generic_fls(x) : \
|
||||||
({ int __r; asm("clz\t%0, %1" : "=r"(__r) : "r"(x) : "cc"); 32-__r; }) )
|
({ int __r; asm("clz\t%0, %1" : "=r"(__r) : "r"(x) : "cc"); 32-__r; }) )
|
||||||
|
|
|
@ -75,4 +75,5 @@ int idr_pre_get(struct idr *idp, unsigned gfp_mask);
|
||||||
int idr_get_new(struct idr *idp, void *ptr, int *id);
|
int idr_get_new(struct idr *idp, void *ptr, int *id);
|
||||||
int idr_get_new_above(struct idr *idp, void *ptr, int starting_id, int *id);
|
int idr_get_new_above(struct idr *idp, void *ptr, int starting_id, int *id);
|
||||||
void idr_remove(struct idr *idp, int id);
|
void idr_remove(struct idr *idp, int id);
|
||||||
|
void idr_destroy(struct idr *idp);
|
||||||
void idr_init(struct idr *idp);
|
void idr_init(struct idr *idp);
|
||||||
|
|
|
@ -723,6 +723,7 @@
|
||||||
#define PCI_DEVICE_ID_HP_DIVA_EVEREST 0x1282
|
#define PCI_DEVICE_ID_HP_DIVA_EVEREST 0x1282
|
||||||
#define PCI_DEVICE_ID_HP_DIVA_AUX 0x1290
|
#define PCI_DEVICE_ID_HP_DIVA_AUX 0x1290
|
||||||
#define PCI_DEVICE_ID_HP_DIVA_RMP3 0x1301
|
#define PCI_DEVICE_ID_HP_DIVA_RMP3 0x1301
|
||||||
|
#define PCI_DEVICE_ID_HP_DIVA_HURRICANE 0x132a
|
||||||
#define PCI_DEVICE_ID_HP_CISS 0x3210
|
#define PCI_DEVICE_ID_HP_CISS 0x3210
|
||||||
#define PCI_DEVICE_ID_HP_CISSA 0x3220
|
#define PCI_DEVICE_ID_HP_CISSA 0x3220
|
||||||
#define PCI_DEVICE_ID_HP_CISSB 0x3222
|
#define PCI_DEVICE_ID_HP_CISSB 0x3222
|
||||||
|
@ -2696,6 +2697,7 @@
|
||||||
|
|
||||||
#define PCI_SUBVENDOR_ID_EXSYS 0xd84d
|
#define PCI_SUBVENDOR_ID_EXSYS 0xd84d
|
||||||
#define PCI_SUBDEVICE_ID_EXSYS_4014 0x4014
|
#define PCI_SUBDEVICE_ID_EXSYS_4014 0x4014
|
||||||
|
#define PCI_SUBDEVICE_ID_EXSYS_4055 0x4055
|
||||||
|
|
||||||
#define PCI_VENDOR_ID_TIGERJET 0xe159
|
#define PCI_VENDOR_ID_TIGERJET 0xe159
|
||||||
#define PCI_DEVICE_ID_TIGERJET_300 0x0001
|
#define PCI_DEVICE_ID_TIGERJET_300 0x0001
|
||||||
|
|
|
@ -171,7 +171,7 @@ typedef struct {
|
||||||
ax25_address calls[AX25_MAX_DIGIS];
|
ax25_address calls[AX25_MAX_DIGIS];
|
||||||
unsigned char repeated[AX25_MAX_DIGIS];
|
unsigned char repeated[AX25_MAX_DIGIS];
|
||||||
unsigned char ndigi;
|
unsigned char ndigi;
|
||||||
char lastrepeat;
|
signed char lastrepeat;
|
||||||
} ax25_digi;
|
} ax25_digi;
|
||||||
|
|
||||||
typedef struct ax25_route {
|
typedef struct ax25_route {
|
||||||
|
|
|
@ -254,8 +254,10 @@ static inline void llc_pdu_decode_sa(struct sk_buff *skb, u8 *sa)
|
||||||
{
|
{
|
||||||
if (skb->protocol == ntohs(ETH_P_802_2))
|
if (skb->protocol == ntohs(ETH_P_802_2))
|
||||||
memcpy(sa, eth_hdr(skb)->h_source, ETH_ALEN);
|
memcpy(sa, eth_hdr(skb)->h_source, ETH_ALEN);
|
||||||
else if (skb->protocol == ntohs(ETH_P_TR_802_2))
|
else if (skb->protocol == ntohs(ETH_P_TR_802_2)) {
|
||||||
memcpy(sa, tr_hdr(skb)->saddr, ETH_ALEN);
|
memcpy(sa, tr_hdr(skb)->saddr, ETH_ALEN);
|
||||||
|
*sa &= 0x7F;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -825,14 +825,6 @@ fastcall NORET_TYPE void do_exit(long code)
|
||||||
|
|
||||||
tsk->flags |= PF_EXITING;
|
tsk->flags |= PF_EXITING;
|
||||||
|
|
||||||
/*
|
|
||||||
* Make sure we don't try to process any timer firings
|
|
||||||
* while we are already exiting.
|
|
||||||
*/
|
|
||||||
tsk->it_virt_expires = cputime_zero;
|
|
||||||
tsk->it_prof_expires = cputime_zero;
|
|
||||||
tsk->it_sched_expires = 0;
|
|
||||||
|
|
||||||
if (unlikely(in_atomic()))
|
if (unlikely(in_atomic()))
|
||||||
printk(KERN_INFO "note: %s[%d] exited with preempt_count %d\n",
|
printk(KERN_INFO "note: %s[%d] exited with preempt_count %d\n",
|
||||||
current->comm, current->pid,
|
current->comm, current->pid,
|
||||||
|
|
|
@ -91,7 +91,7 @@ static inline union cpu_time_count cpu_time_sub(clockid_t which_clock,
|
||||||
* Update expiry time from increment, and increase overrun count,
|
* Update expiry time from increment, and increase overrun count,
|
||||||
* given the current clock sample.
|
* given the current clock sample.
|
||||||
*/
|
*/
|
||||||
static inline void bump_cpu_timer(struct k_itimer *timer,
|
static void bump_cpu_timer(struct k_itimer *timer,
|
||||||
union cpu_time_count now)
|
union cpu_time_count now)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -110,7 +110,7 @@ static inline void bump_cpu_timer(struct k_itimer *timer,
|
||||||
for (i = 0; incr < delta - incr; i++)
|
for (i = 0; incr < delta - incr; i++)
|
||||||
incr = incr << 1;
|
incr = incr << 1;
|
||||||
for (; i >= 0; incr >>= 1, i--) {
|
for (; i >= 0; incr >>= 1, i--) {
|
||||||
if (delta <= incr)
|
if (delta < incr)
|
||||||
continue;
|
continue;
|
||||||
timer->it.cpu.expires.sched += incr;
|
timer->it.cpu.expires.sched += incr;
|
||||||
timer->it_overrun += 1 << i;
|
timer->it_overrun += 1 << i;
|
||||||
|
@ -128,7 +128,7 @@ static inline void bump_cpu_timer(struct k_itimer *timer,
|
||||||
for (i = 0; cputime_lt(incr, cputime_sub(delta, incr)); i++)
|
for (i = 0; cputime_lt(incr, cputime_sub(delta, incr)); i++)
|
||||||
incr = cputime_add(incr, incr);
|
incr = cputime_add(incr, incr);
|
||||||
for (; i >= 0; incr = cputime_halve(incr), i--) {
|
for (; i >= 0; incr = cputime_halve(incr), i--) {
|
||||||
if (cputime_le(delta, incr))
|
if (cputime_lt(delta, incr))
|
||||||
continue;
|
continue;
|
||||||
timer->it.cpu.expires.cpu =
|
timer->it.cpu.expires.cpu =
|
||||||
cputime_add(timer->it.cpu.expires.cpu, incr);
|
cputime_add(timer->it.cpu.expires.cpu, incr);
|
||||||
|
@ -380,14 +380,9 @@ int posix_cpu_timer_create(struct k_itimer *new_timer)
|
||||||
int posix_cpu_timer_del(struct k_itimer *timer)
|
int posix_cpu_timer_del(struct k_itimer *timer)
|
||||||
{
|
{
|
||||||
struct task_struct *p = timer->it.cpu.task;
|
struct task_struct *p = timer->it.cpu.task;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
if (timer->it.cpu.firing)
|
if (likely(p != NULL)) {
|
||||||
return TIMER_RETRY;
|
|
||||||
|
|
||||||
if (unlikely(p == NULL))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
if (!list_empty(&timer->it.cpu.entry)) {
|
|
||||||
read_lock(&tasklist_lock);
|
read_lock(&tasklist_lock);
|
||||||
if (unlikely(p->signal == NULL)) {
|
if (unlikely(p->signal == NULL)) {
|
||||||
/*
|
/*
|
||||||
|
@ -396,18 +391,20 @@ int posix_cpu_timer_del(struct k_itimer *timer)
|
||||||
*/
|
*/
|
||||||
BUG_ON(!list_empty(&timer->it.cpu.entry));
|
BUG_ON(!list_empty(&timer->it.cpu.entry));
|
||||||
} else {
|
} else {
|
||||||
/*
|
|
||||||
* Take us off the task's timer list.
|
|
||||||
*/
|
|
||||||
spin_lock(&p->sighand->siglock);
|
spin_lock(&p->sighand->siglock);
|
||||||
list_del(&timer->it.cpu.entry);
|
if (timer->it.cpu.firing)
|
||||||
|
ret = TIMER_RETRY;
|
||||||
|
else
|
||||||
|
list_del(&timer->it.cpu.entry);
|
||||||
spin_unlock(&p->sighand->siglock);
|
spin_unlock(&p->sighand->siglock);
|
||||||
}
|
}
|
||||||
read_unlock(&tasklist_lock);
|
read_unlock(&tasklist_lock);
|
||||||
}
|
|
||||||
put_task_struct(p);
|
|
||||||
|
|
||||||
return 0;
|
if (!ret)
|
||||||
|
put_task_struct(p);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -424,8 +421,6 @@ static void cleanup_timers(struct list_head *head,
|
||||||
cputime_t ptime = cputime_add(utime, stime);
|
cputime_t ptime = cputime_add(utime, stime);
|
||||||
|
|
||||||
list_for_each_entry_safe(timer, next, head, entry) {
|
list_for_each_entry_safe(timer, next, head, entry) {
|
||||||
put_task_struct(timer->task);
|
|
||||||
timer->task = NULL;
|
|
||||||
list_del_init(&timer->entry);
|
list_del_init(&timer->entry);
|
||||||
if (cputime_lt(timer->expires.cpu, ptime)) {
|
if (cputime_lt(timer->expires.cpu, ptime)) {
|
||||||
timer->expires.cpu = cputime_zero;
|
timer->expires.cpu = cputime_zero;
|
||||||
|
@ -437,8 +432,6 @@ static void cleanup_timers(struct list_head *head,
|
||||||
|
|
||||||
++head;
|
++head;
|
||||||
list_for_each_entry_safe(timer, next, head, entry) {
|
list_for_each_entry_safe(timer, next, head, entry) {
|
||||||
put_task_struct(timer->task);
|
|
||||||
timer->task = NULL;
|
|
||||||
list_del_init(&timer->entry);
|
list_del_init(&timer->entry);
|
||||||
if (cputime_lt(timer->expires.cpu, utime)) {
|
if (cputime_lt(timer->expires.cpu, utime)) {
|
||||||
timer->expires.cpu = cputime_zero;
|
timer->expires.cpu = cputime_zero;
|
||||||
|
@ -450,8 +443,6 @@ static void cleanup_timers(struct list_head *head,
|
||||||
|
|
||||||
++head;
|
++head;
|
||||||
list_for_each_entry_safe(timer, next, head, entry) {
|
list_for_each_entry_safe(timer, next, head, entry) {
|
||||||
put_task_struct(timer->task);
|
|
||||||
timer->task = NULL;
|
|
||||||
list_del_init(&timer->entry);
|
list_del_init(&timer->entry);
|
||||||
if (timer->expires.sched < sched_time) {
|
if (timer->expires.sched < sched_time) {
|
||||||
timer->expires.sched = 0;
|
timer->expires.sched = 0;
|
||||||
|
@ -495,6 +486,9 @@ static void process_timer_rebalance(struct task_struct *p,
|
||||||
struct task_struct *t = p;
|
struct task_struct *t = p;
|
||||||
unsigned int nthreads = atomic_read(&p->signal->live);
|
unsigned int nthreads = atomic_read(&p->signal->live);
|
||||||
|
|
||||||
|
if (!nthreads)
|
||||||
|
return;
|
||||||
|
|
||||||
switch (clock_idx) {
|
switch (clock_idx) {
|
||||||
default:
|
default:
|
||||||
BUG();
|
BUG();
|
||||||
|
@ -582,17 +576,15 @@ static void arm_timer(struct k_itimer *timer, union cpu_time_count now)
|
||||||
listpos = head;
|
listpos = head;
|
||||||
if (CPUCLOCK_WHICH(timer->it_clock) == CPUCLOCK_SCHED) {
|
if (CPUCLOCK_WHICH(timer->it_clock) == CPUCLOCK_SCHED) {
|
||||||
list_for_each_entry(next, head, entry) {
|
list_for_each_entry(next, head, entry) {
|
||||||
if (next->expires.sched > nt->expires.sched) {
|
if (next->expires.sched > nt->expires.sched)
|
||||||
listpos = &next->entry;
|
|
||||||
break;
|
break;
|
||||||
}
|
listpos = &next->entry;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
list_for_each_entry(next, head, entry) {
|
list_for_each_entry(next, head, entry) {
|
||||||
if (cputime_gt(next->expires.cpu, nt->expires.cpu)) {
|
if (cputime_gt(next->expires.cpu, nt->expires.cpu))
|
||||||
listpos = &next->entry;
|
|
||||||
break;
|
break;
|
||||||
}
|
listpos = &next->entry;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
list_add(&nt->entry, listpos);
|
list_add(&nt->entry, listpos);
|
||||||
|
@ -736,9 +728,15 @@ int posix_cpu_timer_set(struct k_itimer *timer, int flags,
|
||||||
* Disarm any old timer after extracting its expiry time.
|
* Disarm any old timer after extracting its expiry time.
|
||||||
*/
|
*/
|
||||||
BUG_ON(!irqs_disabled());
|
BUG_ON(!irqs_disabled());
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
spin_lock(&p->sighand->siglock);
|
spin_lock(&p->sighand->siglock);
|
||||||
old_expires = timer->it.cpu.expires;
|
old_expires = timer->it.cpu.expires;
|
||||||
list_del_init(&timer->it.cpu.entry);
|
if (unlikely(timer->it.cpu.firing)) {
|
||||||
|
timer->it.cpu.firing = -1;
|
||||||
|
ret = TIMER_RETRY;
|
||||||
|
} else
|
||||||
|
list_del_init(&timer->it.cpu.entry);
|
||||||
spin_unlock(&p->sighand->siglock);
|
spin_unlock(&p->sighand->siglock);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -786,7 +784,7 @@ int posix_cpu_timer_set(struct k_itimer *timer, int flags,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlikely(timer->it.cpu.firing)) {
|
if (unlikely(ret)) {
|
||||||
/*
|
/*
|
||||||
* We are colliding with the timer actually firing.
|
* We are colliding with the timer actually firing.
|
||||||
* Punt after filling in the timer's old value, and
|
* Punt after filling in the timer's old value, and
|
||||||
|
@ -794,8 +792,6 @@ int posix_cpu_timer_set(struct k_itimer *timer, int flags,
|
||||||
* it as an overrun (thanks to bump_cpu_timer above).
|
* it as an overrun (thanks to bump_cpu_timer above).
|
||||||
*/
|
*/
|
||||||
read_unlock(&tasklist_lock);
|
read_unlock(&tasklist_lock);
|
||||||
timer->it.cpu.firing = -1;
|
|
||||||
ret = TIMER_RETRY;
|
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -961,14 +957,16 @@ void posix_cpu_timer_get(struct k_itimer *timer, struct itimerspec *itp)
|
||||||
static void check_thread_timers(struct task_struct *tsk,
|
static void check_thread_timers(struct task_struct *tsk,
|
||||||
struct list_head *firing)
|
struct list_head *firing)
|
||||||
{
|
{
|
||||||
|
int maxfire;
|
||||||
struct list_head *timers = tsk->cpu_timers;
|
struct list_head *timers = tsk->cpu_timers;
|
||||||
|
|
||||||
|
maxfire = 20;
|
||||||
tsk->it_prof_expires = cputime_zero;
|
tsk->it_prof_expires = cputime_zero;
|
||||||
while (!list_empty(timers)) {
|
while (!list_empty(timers)) {
|
||||||
struct cpu_timer_list *t = list_entry(timers->next,
|
struct cpu_timer_list *t = list_entry(timers->next,
|
||||||
struct cpu_timer_list,
|
struct cpu_timer_list,
|
||||||
entry);
|
entry);
|
||||||
if (cputime_lt(prof_ticks(tsk), t->expires.cpu)) {
|
if (!--maxfire || cputime_lt(prof_ticks(tsk), t->expires.cpu)) {
|
||||||
tsk->it_prof_expires = t->expires.cpu;
|
tsk->it_prof_expires = t->expires.cpu;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -977,12 +975,13 @@ static void check_thread_timers(struct task_struct *tsk,
|
||||||
}
|
}
|
||||||
|
|
||||||
++timers;
|
++timers;
|
||||||
|
maxfire = 20;
|
||||||
tsk->it_virt_expires = cputime_zero;
|
tsk->it_virt_expires = cputime_zero;
|
||||||
while (!list_empty(timers)) {
|
while (!list_empty(timers)) {
|
||||||
struct cpu_timer_list *t = list_entry(timers->next,
|
struct cpu_timer_list *t = list_entry(timers->next,
|
||||||
struct cpu_timer_list,
|
struct cpu_timer_list,
|
||||||
entry);
|
entry);
|
||||||
if (cputime_lt(virt_ticks(tsk), t->expires.cpu)) {
|
if (!--maxfire || cputime_lt(virt_ticks(tsk), t->expires.cpu)) {
|
||||||
tsk->it_virt_expires = t->expires.cpu;
|
tsk->it_virt_expires = t->expires.cpu;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -991,12 +990,13 @@ static void check_thread_timers(struct task_struct *tsk,
|
||||||
}
|
}
|
||||||
|
|
||||||
++timers;
|
++timers;
|
||||||
|
maxfire = 20;
|
||||||
tsk->it_sched_expires = 0;
|
tsk->it_sched_expires = 0;
|
||||||
while (!list_empty(timers)) {
|
while (!list_empty(timers)) {
|
||||||
struct cpu_timer_list *t = list_entry(timers->next,
|
struct cpu_timer_list *t = list_entry(timers->next,
|
||||||
struct cpu_timer_list,
|
struct cpu_timer_list,
|
||||||
entry);
|
entry);
|
||||||
if (tsk->sched_time < t->expires.sched) {
|
if (!--maxfire || tsk->sched_time < t->expires.sched) {
|
||||||
tsk->it_sched_expires = t->expires.sched;
|
tsk->it_sched_expires = t->expires.sched;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1013,6 +1013,7 @@ static void check_thread_timers(struct task_struct *tsk,
|
||||||
static void check_process_timers(struct task_struct *tsk,
|
static void check_process_timers(struct task_struct *tsk,
|
||||||
struct list_head *firing)
|
struct list_head *firing)
|
||||||
{
|
{
|
||||||
|
int maxfire;
|
||||||
struct signal_struct *const sig = tsk->signal;
|
struct signal_struct *const sig = tsk->signal;
|
||||||
cputime_t utime, stime, ptime, virt_expires, prof_expires;
|
cputime_t utime, stime, ptime, virt_expires, prof_expires;
|
||||||
unsigned long long sched_time, sched_expires;
|
unsigned long long sched_time, sched_expires;
|
||||||
|
@ -1045,12 +1046,13 @@ static void check_process_timers(struct task_struct *tsk,
|
||||||
} while (t != tsk);
|
} while (t != tsk);
|
||||||
ptime = cputime_add(utime, stime);
|
ptime = cputime_add(utime, stime);
|
||||||
|
|
||||||
|
maxfire = 20;
|
||||||
prof_expires = cputime_zero;
|
prof_expires = cputime_zero;
|
||||||
while (!list_empty(timers)) {
|
while (!list_empty(timers)) {
|
||||||
struct cpu_timer_list *t = list_entry(timers->next,
|
struct cpu_timer_list *t = list_entry(timers->next,
|
||||||
struct cpu_timer_list,
|
struct cpu_timer_list,
|
||||||
entry);
|
entry);
|
||||||
if (cputime_lt(ptime, t->expires.cpu)) {
|
if (!--maxfire || cputime_lt(ptime, t->expires.cpu)) {
|
||||||
prof_expires = t->expires.cpu;
|
prof_expires = t->expires.cpu;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1059,12 +1061,13 @@ static void check_process_timers(struct task_struct *tsk,
|
||||||
}
|
}
|
||||||
|
|
||||||
++timers;
|
++timers;
|
||||||
|
maxfire = 20;
|
||||||
virt_expires = cputime_zero;
|
virt_expires = cputime_zero;
|
||||||
while (!list_empty(timers)) {
|
while (!list_empty(timers)) {
|
||||||
struct cpu_timer_list *t = list_entry(timers->next,
|
struct cpu_timer_list *t = list_entry(timers->next,
|
||||||
struct cpu_timer_list,
|
struct cpu_timer_list,
|
||||||
entry);
|
entry);
|
||||||
if (cputime_lt(utime, t->expires.cpu)) {
|
if (!--maxfire || cputime_lt(utime, t->expires.cpu)) {
|
||||||
virt_expires = t->expires.cpu;
|
virt_expires = t->expires.cpu;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1073,12 +1076,13 @@ static void check_process_timers(struct task_struct *tsk,
|
||||||
}
|
}
|
||||||
|
|
||||||
++timers;
|
++timers;
|
||||||
|
maxfire = 20;
|
||||||
sched_expires = 0;
|
sched_expires = 0;
|
||||||
while (!list_empty(timers)) {
|
while (!list_empty(timers)) {
|
||||||
struct cpu_timer_list *t = list_entry(timers->next,
|
struct cpu_timer_list *t = list_entry(timers->next,
|
||||||
struct cpu_timer_list,
|
struct cpu_timer_list,
|
||||||
entry);
|
entry);
|
||||||
if (sched_time < t->expires.sched) {
|
if (!--maxfire || sched_time < t->expires.sched) {
|
||||||
sched_expires = t->expires.sched;
|
sched_expires = t->expires.sched;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1161,6 +1165,9 @@ static void check_process_timers(struct task_struct *tsk,
|
||||||
unsigned long long sched_left, sched;
|
unsigned long long sched_left, sched;
|
||||||
const unsigned int nthreads = atomic_read(&sig->live);
|
const unsigned int nthreads = atomic_read(&sig->live);
|
||||||
|
|
||||||
|
if (!nthreads)
|
||||||
|
return;
|
||||||
|
|
||||||
prof_left = cputime_sub(prof_expires, utime);
|
prof_left = cputime_sub(prof_expires, utime);
|
||||||
prof_left = cputime_sub(prof_left, stime);
|
prof_left = cputime_sub(prof_left, stime);
|
||||||
prof_left = cputime_div(prof_left, nthreads);
|
prof_left = cputime_div(prof_left, nthreads);
|
||||||
|
@ -1286,30 +1293,30 @@ void run_posix_cpu_timers(struct task_struct *tsk)
|
||||||
|
|
||||||
#undef UNEXPIRED
|
#undef UNEXPIRED
|
||||||
|
|
||||||
BUG_ON(tsk->exit_state);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Double-check with locks held.
|
* Double-check with locks held.
|
||||||
*/
|
*/
|
||||||
read_lock(&tasklist_lock);
|
read_lock(&tasklist_lock);
|
||||||
spin_lock(&tsk->sighand->siglock);
|
if (likely(tsk->signal != NULL)) {
|
||||||
|
spin_lock(&tsk->sighand->siglock);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Here we take off tsk->cpu_timers[N] and tsk->signal->cpu_timers[N]
|
* Here we take off tsk->cpu_timers[N] and tsk->signal->cpu_timers[N]
|
||||||
* all the timers that are firing, and put them on the firing list.
|
* all the timers that are firing, and put them on the firing list.
|
||||||
*/
|
*/
|
||||||
check_thread_timers(tsk, &firing);
|
check_thread_timers(tsk, &firing);
|
||||||
check_process_timers(tsk, &firing);
|
check_process_timers(tsk, &firing);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We must release these locks before taking any timer's lock.
|
* We must release these locks before taking any timer's lock.
|
||||||
* There is a potential race with timer deletion here, as the
|
* There is a potential race with timer deletion here, as the
|
||||||
* siglock now protects our private firing list. We have set
|
* siglock now protects our private firing list. We have set
|
||||||
* the firing flag in each timer, so that a deletion attempt
|
* the firing flag in each timer, so that a deletion attempt
|
||||||
* that gets the timer lock before we do will give it up and
|
* that gets the timer lock before we do will give it up and
|
||||||
* spin until we've taken care of that timer below.
|
* spin until we've taken care of that timer below.
|
||||||
*/
|
*/
|
||||||
spin_unlock(&tsk->sighand->siglock);
|
spin_unlock(&tsk->sighand->siglock);
|
||||||
|
}
|
||||||
read_unlock(&tasklist_lock);
|
read_unlock(&tasklist_lock);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -3879,6 +3879,7 @@ EXPORT_SYMBOL(cpu_present_map);
|
||||||
|
|
||||||
#ifndef CONFIG_SMP
|
#ifndef CONFIG_SMP
|
||||||
cpumask_t cpu_online_map = CPU_MASK_ALL;
|
cpumask_t cpu_online_map = CPU_MASK_ALL;
|
||||||
|
EXPORT_SYMBOL_GPL(cpu_online_map);
|
||||||
cpumask_t cpu_possible_map = CPU_MASK_ALL;
|
cpumask_t cpu_possible_map = CPU_MASK_ALL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
13
lib/idr.c
13
lib/idr.c
|
@ -345,6 +345,19 @@ void idr_remove(struct idr *idp, int id)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(idr_remove);
|
EXPORT_SYMBOL(idr_remove);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* idr_destroy - release all cached layers within an idr tree
|
||||||
|
* idp: idr handle
|
||||||
|
*/
|
||||||
|
void idr_destroy(struct idr *idp)
|
||||||
|
{
|
||||||
|
while (idp->id_free_cnt) {
|
||||||
|
struct idr_layer *p = alloc_layer(idp);
|
||||||
|
kmem_cache_free(idr_layer_cache, p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(idr_destroy);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* idr_find - return pointer for given id
|
* idr_find - return pointer for given id
|
||||||
* @idp: idr handle
|
* @idp: idr handle
|
||||||
|
|
|
@ -1750,6 +1750,8 @@ inline void setup_pageset(struct per_cpu_pageset *p, unsigned long batch)
|
||||||
{
|
{
|
||||||
struct per_cpu_pages *pcp;
|
struct per_cpu_pages *pcp;
|
||||||
|
|
||||||
|
memset(p, 0, sizeof(*p));
|
||||||
|
|
||||||
pcp = &p->pcp[0]; /* hot */
|
pcp = &p->pcp[0]; /* hot */
|
||||||
pcp->count = 0;
|
pcp->count = 0;
|
||||||
pcp->low = 2 * batch;
|
pcp->low = 2 * batch;
|
||||||
|
|
|
@ -340,9 +340,10 @@ static void tr_add_rif_info(struct trh_hdr *trh, struct net_device *dev)
|
||||||
unsigned int hash, rii_p = 0;
|
unsigned int hash, rii_p = 0;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct rif_cache *entry;
|
struct rif_cache *entry;
|
||||||
|
unsigned char saddr0;
|
||||||
|
|
||||||
spin_lock_irqsave(&rif_lock, flags);
|
spin_lock_irqsave(&rif_lock, flags);
|
||||||
|
saddr0 = trh->saddr[0];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Firstly see if the entry exists
|
* Firstly see if the entry exists
|
||||||
|
@ -395,7 +396,6 @@ printk("adding rif_entry: addr:%02X:%02X:%02X:%02X:%02X:%02X rcf:%04X\n",
|
||||||
entry->rcf = trh->rcf & htons((unsigned short)~TR_RCF_BROADCAST_MASK);
|
entry->rcf = trh->rcf & htons((unsigned short)~TR_RCF_BROADCAST_MASK);
|
||||||
memcpy(&(entry->rseg[0]),&(trh->rseg[0]),8*sizeof(unsigned short));
|
memcpy(&(entry->rseg[0]),&(trh->rseg[0]),8*sizeof(unsigned short));
|
||||||
entry->local_ring = 0;
|
entry->local_ring = 0;
|
||||||
trh->saddr[0]|=TR_RII; /* put the routing indicator back for tcpdump */
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -422,6 +422,7 @@ printk("updating rif_entry: addr:%02X:%02X:%02X:%02X:%02X:%02X rcf:%04X\n",
|
||||||
}
|
}
|
||||||
entry->last_used=jiffies;
|
entry->last_used=jiffies;
|
||||||
}
|
}
|
||||||
|
trh->saddr[0]=saddr0; /* put the routing indicator back for tcpdump */
|
||||||
spin_unlock_irqrestore(&rif_lock, flags);
|
spin_unlock_irqrestore(&rif_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -175,39 +175,10 @@ static void pneigh_queue_purge(struct sk_buff_head *list)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void neigh_changeaddr(struct neigh_table *tbl, struct net_device *dev)
|
static void neigh_flush_dev(struct neigh_table *tbl, struct net_device *dev)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
write_lock_bh(&tbl->lock);
|
|
||||||
|
|
||||||
for (i=0; i <= tbl->hash_mask; i++) {
|
|
||||||
struct neighbour *n, **np;
|
|
||||||
|
|
||||||
np = &tbl->hash_buckets[i];
|
|
||||||
while ((n = *np) != NULL) {
|
|
||||||
if (dev && n->dev != dev) {
|
|
||||||
np = &n->next;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
*np = n->next;
|
|
||||||
write_lock_bh(&n->lock);
|
|
||||||
n->dead = 1;
|
|
||||||
neigh_del_timer(n);
|
|
||||||
write_unlock_bh(&n->lock);
|
|
||||||
neigh_release(n);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
write_unlock_bh(&tbl->lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
int neigh_ifdown(struct neigh_table *tbl, struct net_device *dev)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
write_lock_bh(&tbl->lock);
|
|
||||||
|
|
||||||
for (i = 0; i <= tbl->hash_mask; i++) {
|
for (i = 0; i <= tbl->hash_mask; i++) {
|
||||||
struct neighbour *n, **np = &tbl->hash_buckets[i];
|
struct neighbour *n, **np = &tbl->hash_buckets[i];
|
||||||
|
|
||||||
|
@ -243,7 +214,19 @@ int neigh_ifdown(struct neigh_table *tbl, struct net_device *dev)
|
||||||
neigh_release(n);
|
neigh_release(n);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void neigh_changeaddr(struct neigh_table *tbl, struct net_device *dev)
|
||||||
|
{
|
||||||
|
write_lock_bh(&tbl->lock);
|
||||||
|
neigh_flush_dev(tbl, dev);
|
||||||
|
write_unlock_bh(&tbl->lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
int neigh_ifdown(struct neigh_table *tbl, struct net_device *dev)
|
||||||
|
{
|
||||||
|
write_lock_bh(&tbl->lock);
|
||||||
|
neigh_flush_dev(tbl, dev);
|
||||||
pneigh_ifdown(tbl, dev);
|
pneigh_ifdown(tbl, dev);
|
||||||
write_unlock_bh(&tbl->lock);
|
write_unlock_bh(&tbl->lock);
|
||||||
|
|
||||||
|
@ -732,6 +715,7 @@ static inline void neigh_add_timer(struct neighbour *n, unsigned long when)
|
||||||
if (unlikely(mod_timer(&n->timer, when))) {
|
if (unlikely(mod_timer(&n->timer, when))) {
|
||||||
printk("NEIGH: BUG, double timer add, state is %x\n",
|
printk("NEIGH: BUG, double timer add, state is %x\n",
|
||||||
n->nud_state);
|
n->nud_state);
|
||||||
|
dump_stack();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -815,10 +799,10 @@ static void neigh_timer_handler(unsigned long arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (neigh->nud_state & NUD_IN_TIMER) {
|
if (neigh->nud_state & NUD_IN_TIMER) {
|
||||||
neigh_hold(neigh);
|
|
||||||
if (time_before(next, jiffies + HZ/2))
|
if (time_before(next, jiffies + HZ/2))
|
||||||
next = jiffies + HZ/2;
|
next = jiffies + HZ/2;
|
||||||
neigh_add_timer(neigh, next);
|
if (!mod_timer(&neigh->timer, next))
|
||||||
|
neigh_hold(neigh);
|
||||||
}
|
}
|
||||||
if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) {
|
if (neigh->nud_state & (NUD_INCOMPLETE | NUD_PROBE)) {
|
||||||
struct sk_buff *skb = skb_peek(&neigh->arp_queue);
|
struct sk_buff *skb = skb_peek(&neigh->arp_queue);
|
||||||
|
|
|
@ -410,6 +410,9 @@ struct sk_buff *skb_clone(struct sk_buff *skb, gfp_t gfp_mask)
|
||||||
C(nfct);
|
C(nfct);
|
||||||
nf_conntrack_get(skb->nfct);
|
nf_conntrack_get(skb->nfct);
|
||||||
C(nfctinfo);
|
C(nfctinfo);
|
||||||
|
#if defined(CONFIG_IP_VS) || defined(CONFIG_IP_VS_MODULE)
|
||||||
|
C(ipvs_property);
|
||||||
|
#endif
|
||||||
#ifdef CONFIG_BRIDGE_NETFILTER
|
#ifdef CONFIG_BRIDGE_NETFILTER
|
||||||
C(nf_bridge);
|
C(nf_bridge);
|
||||||
nf_bridge_get(skb->nf_bridge);
|
nf_bridge_get(skb->nf_bridge);
|
||||||
|
@ -467,6 +470,9 @@ static void copy_skb_header(struct sk_buff *new, const struct sk_buff *old)
|
||||||
new->nfct = old->nfct;
|
new->nfct = old->nfct;
|
||||||
nf_conntrack_get(old->nfct);
|
nf_conntrack_get(old->nfct);
|
||||||
new->nfctinfo = old->nfctinfo;
|
new->nfctinfo = old->nfctinfo;
|
||||||
|
#if defined(CONFIG_IP_VS) || defined(CONFIG_IP_VS_MODULE)
|
||||||
|
new->ipvs_property = old->ipvs_property;
|
||||||
|
#endif
|
||||||
#ifdef CONFIG_BRIDGE_NETFILTER
|
#ifdef CONFIG_BRIDGE_NETFILTER
|
||||||
new->nf_bridge = old->nf_bridge;
|
new->nf_bridge = old->nf_bridge;
|
||||||
nf_bridge_get(old->nf_bridge);
|
nf_bridge_get(old->nf_bridge);
|
||||||
|
|
|
@ -455,10 +455,15 @@ static inline struct iw_statistics *get_wireless_stats(struct net_device *dev)
|
||||||
|
|
||||||
/* Old location, field to be removed in next WE */
|
/* Old location, field to be removed in next WE */
|
||||||
if(dev->get_wireless_stats) {
|
if(dev->get_wireless_stats) {
|
||||||
printk(KERN_DEBUG "%s (WE) : Driver using old /proc/net/wireless support, please fix driver !\n",
|
static int printed_message;
|
||||||
dev->name);
|
|
||||||
|
if (!printed_message++)
|
||||||
|
printk(KERN_DEBUG "%s (WE) : Driver using old /proc/net/wireless support, please fix driver !\n",
|
||||||
|
dev->name);
|
||||||
|
|
||||||
return dev->get_wireless_stats(dev);
|
return dev->get_wireless_stats(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Not found */
|
/* Not found */
|
||||||
return (struct iw_statistics *) NULL;
|
return (struct iw_statistics *) NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -391,6 +391,9 @@ static void ip_copy_metadata(struct sk_buff *to, struct sk_buff *from)
|
||||||
to->nfct = from->nfct;
|
to->nfct = from->nfct;
|
||||||
nf_conntrack_get(to->nfct);
|
nf_conntrack_get(to->nfct);
|
||||||
to->nfctinfo = from->nfctinfo;
|
to->nfctinfo = from->nfctinfo;
|
||||||
|
#if defined(CONFIG_IP_VS) || defined(CONFIG_IP_VS_MODULE)
|
||||||
|
to->ipvs_property = from->ipvs_property;
|
||||||
|
#endif
|
||||||
#ifdef CONFIG_BRIDGE_NETFILTER
|
#ifdef CONFIG_BRIDGE_NETFILTER
|
||||||
nf_bridge_put(to->nf_bridge);
|
nf_bridge_put(to->nf_bridge);
|
||||||
to->nf_bridge = from->nf_bridge;
|
to->nf_bridge = from->nf_bridge;
|
||||||
|
|
|
@ -483,7 +483,7 @@ int ipv6_flowlabel_opt(struct sock *sk, char __user *optval, int optlen)
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
fl1 = sfl->fl;
|
fl1 = sfl->fl;
|
||||||
atomic_inc(&fl->users);
|
atomic_inc(&fl1->users);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -587,7 +587,7 @@ svc_udp_recvfrom(struct svc_rqst *rqstp)
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
|
|
||||||
tv.tv_sec = xtime.tv_sec;
|
tv.tv_sec = xtime.tv_sec;
|
||||||
tv.tv_usec = xtime.tv_nsec * 1000;
|
tv.tv_usec = xtime.tv_nsec / NSEC_PER_USEC;
|
||||||
skb_set_timestamp(skb, &tv);
|
skb_set_timestamp(skb, &tv);
|
||||||
/* Don't enable netstamp, sunrpc doesn't
|
/* Don't enable netstamp, sunrpc doesn't
|
||||||
need that much accuracy */
|
need that much accuracy */
|
||||||
|
|
|
@ -879,7 +879,7 @@ static ssize_t sel_commit_bools_write(struct file *filep,
|
||||||
if (sscanf(page, "%d", &new_value) != 1)
|
if (sscanf(page, "%d", &new_value) != 1)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (new_value) {
|
if (new_value && bool_pending_values) {
|
||||||
security_set_bools(bool_num, bool_pending_values);
|
security_set_bools(bool_num, bool_pending_values);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -952,6 +952,7 @@ static int sel_make_bools(void)
|
||||||
|
|
||||||
/* remove any existing files */
|
/* remove any existing files */
|
||||||
kfree(bool_pending_values);
|
kfree(bool_pending_values);
|
||||||
|
bool_pending_values = NULL;
|
||||||
|
|
||||||
sel_remove_bools(dir);
|
sel_remove_bools(dir);
|
||||||
|
|
||||||
|
@ -1002,6 +1003,7 @@ static int sel_make_bools(void)
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
err:
|
err:
|
||||||
|
kfree(values);
|
||||||
d_genocide(dir);
|
d_genocide(dir);
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto out;
|
goto out;
|
||||||
|
|
|
@ -650,8 +650,10 @@ void policydb_destroy(struct policydb *p)
|
||||||
}
|
}
|
||||||
if (lrt) kfree(lrt);
|
if (lrt) kfree(lrt);
|
||||||
|
|
||||||
for (i = 0; i < p->p_types.nprim; i++)
|
if (p->type_attr_map) {
|
||||||
ebitmap_destroy(&p->type_attr_map[i]);
|
for (i = 0; i < p->p_types.nprim; i++)
|
||||||
|
ebitmap_destroy(&p->type_attr_map[i]);
|
||||||
|
}
|
||||||
kfree(p->type_attr_map);
|
kfree(p->type_attr_map);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -828,7 +828,8 @@ static int snd_generic_suspend(struct device *dev, pm_message_t state, u32 level
|
||||||
card = get_snd_generic_card(dev);
|
card = get_snd_generic_card(dev);
|
||||||
if (card->power_state == SNDRV_CTL_POWER_D3hot)
|
if (card->power_state == SNDRV_CTL_POWER_D3hot)
|
||||||
return 0;
|
return 0;
|
||||||
card->pm_suspend(card, PMSG_SUSPEND);
|
if (card->pm_suspend)
|
||||||
|
card->pm_suspend(card, PMSG_SUSPEND);
|
||||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -843,7 +844,8 @@ static int snd_generic_resume(struct device *dev, u32 level)
|
||||||
card = get_snd_generic_card(dev);
|
card = get_snd_generic_card(dev);
|
||||||
if (card->power_state == SNDRV_CTL_POWER_D0)
|
if (card->power_state == SNDRV_CTL_POWER_D0)
|
||||||
return 0;
|
return 0;
|
||||||
card->pm_resume(card);
|
if (card->pm_suspend)
|
||||||
|
card->pm_resume(card);
|
||||||
snd_power_change_state(card, SNDRV_CTL_POWER_D0);
|
snd_power_change_state(card, SNDRV_CTL_POWER_D0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue