Commit f5afaed8 authored by Andy Grover's avatar Andy Grover

Merge groveronline.com:/root/bk/linux-2.5

into groveronline.com:/root/bk/linux-acpi
parents 26a6239c fb4b1e40
Linux Kernel SCTP
This is the current BETA release of the Linux Kernel SCTP reference
implementation.
SCTP (Stream Control Transmission Protocol) is a IP based, message oriented,
reliable transport protocol, with congestion control, support for
transparent multi-homing, and multiple ordered streams of messages.
RFC2960 defines the core protocol. The IETF SIGTRAN working group originally
developed the SCTP protocol and later handed the protocol over to the
Transport Area (TSVWG) working group for the continued evolvement of SCTP as a
general purpose transport.
See the IETF website (http://www.ietf.org) for further documents on SCTP.
See http://www.ietf.org/rfc/rfc2960.txt
The initial project goal is to create an Linux kernel reference implementation
of SCTP that is RFC 2960 compliant and provides an programming interface
referred to as the UDP-style API of the Sockets Extensions for SCTP, as
proposed in IETF Internet-Drafts.
Caveats:
-lksctp can be built as statically or as a module. However, be aware that
module removal of lksctp is not yet a safe activity.
-There is tentative support for IPv6, but most work has gone towards
implementation and testing lksctp on IPv4.
For more information, please visit the lksctp project website:
http://www.sf.net/projects/lksctp
Or contact the lksctp developers through the mailing list:
<lksctp-developers@lists.sourceforge.net>
...@@ -15,6 +15,7 @@ comment 'General setup' ...@@ -15,6 +15,7 @@ comment 'General setup'
define_bool CONFIG_VT y define_bool CONFIG_VT y
define_bool CONFIG_VT_CONSOLE y define_bool CONFIG_VT_CONSOLE y
define_bool CONFIG_HW_CONSOLE y
bool 'Symmetric multi-processing support (does not work on sun4/sun4c)' CONFIG_SMP bool 'Symmetric multi-processing support (does not work on sun4/sun4c)' CONFIG_SMP
......
...@@ -13,6 +13,7 @@ tristate 'UltraSPARC-III bootbus i2c controller driver' CONFIG_BBC_I2C ...@@ -13,6 +13,7 @@ tristate 'UltraSPARC-III bootbus i2c controller driver' CONFIG_BBC_I2C
define_bool CONFIG_VT y define_bool CONFIG_VT y
define_bool CONFIG_VT_CONSOLE y define_bool CONFIG_VT_CONSOLE y
define_bool CONFIG_HW_CONSOLE y
bool 'Symmetric multi-processing support' CONFIG_SMP bool 'Symmetric multi-processing support' CONFIG_SMP
bool 'Preemptible Kernel' CONFIG_PREEMPT bool 'Preemptible Kernel' CONFIG_PREEMPT
......
...@@ -28,6 +28,7 @@ CONFIG_KMOD=y ...@@ -28,6 +28,7 @@ CONFIG_KMOD=y
CONFIG_BBC_I2C=m CONFIG_BBC_I2C=m
CONFIG_VT=y CONFIG_VT=y
CONFIG_VT_CONSOLE=y CONFIG_VT_CONSOLE=y
CONFIG_HW_CONSOLE=y
CONFIG_SMP=y CONFIG_SMP=y
# CONFIG_PREEMPT is not set # CONFIG_PREEMPT is not set
CONFIG_SPARC64=y CONFIG_SPARC64=y
...@@ -194,67 +195,82 @@ CONFIG_MD_RAID1=m ...@@ -194,67 +195,82 @@ CONFIG_MD_RAID1=m
# ATA/ATAPI/MFM/RLL device support # ATA/ATAPI/MFM/RLL device support
# #
CONFIG_IDE=y CONFIG_IDE=y
#
# IDE, ATA and ATAPI Block devices
#
CONFIG_BLK_DEV_IDE=y CONFIG_BLK_DEV_IDE=y
# CONFIG_BLK_DEV_HD_IDE is not set
# CONFIG_BLK_DEV_HD is not set #
# Please see Documentation/ide.txt for help/info on IDE drives
#
CONFIG_BLK_DEV_IDEDISK=y CONFIG_BLK_DEV_IDEDISK=y
# CONFIG_IDEDISK_MULTI_MODE is not set # CONFIG_IDEDISK_MULTI_MODE is not set
# CONFIG_IDEDISK_STROKE is not set # CONFIG_IDEDISK_STROKE is not set
CONFIG_ATAPI=y # CONFIG_BLK_DEV_IDEDISK_VENDOR is not set
# CONFIG_BLK_DEV_IDEDISK_FUJITSU is not set
# CONFIG_BLK_DEV_IDEDISK_IBM is not set
# CONFIG_BLK_DEV_IDEDISK_MAXTOR is not set
# CONFIG_BLK_DEV_IDEDISK_QUANTUM is not set
# CONFIG_BLK_DEV_IDEDISK_SEAGATE is not set
# CONFIG_BLK_DEV_IDEDISK_WD is not set
# CONFIG_BLK_DEV_COMMERIAL is not set
# CONFIG_BLK_DEV_TIVO is not set
# CONFIG_BLK_DEV_IDECS is not set
CONFIG_BLK_DEV_IDECD=y CONFIG_BLK_DEV_IDECD=y
# CONFIG_BLK_DEV_IDETAPE is not set # CONFIG_BLK_DEV_IDETAPE is not set
# CONFIG_BLK_DEV_IDEFLOPPY is not set # CONFIG_BLK_DEV_IDEFLOPPY is not set
# CONFIG_BLK_DEV_IDESCSI is not set # CONFIG_BLK_DEV_IDESCSI is not set
# CONFIG_BLK_DEV_IDECS is not set # CONFIG_IDE_TASK_IOCTL is not set
# #
# ATA host controller support # IDE chipset support/bugfixes
# #
# CONFIG_BLK_DEV_RZ1000 is not set
# CONFIG_BLK_DEV_CMD640 is not set # CONFIG_BLK_DEV_CMD640 is not set
# CONFIG_BLK_DEV_CMD640_ENHANCED is not set # CONFIG_BLK_DEV_CMD640_ENHANCED is not set
# CONFIG_BLK_DEV_ISAPNP is not set # CONFIG_BLK_DEV_ISAPNP is not set
# CONFIG_BLK_DEV_RZ1000 is not set
# CONFIG_BLK_DEV_IDEPCI=y
# PCI host controller support
#
# CONFIG_BLK_DEV_OFFBOARD is not set
# CONFIG_IDEPCI_SHARE_IRQ is not set # CONFIG_IDEPCI_SHARE_IRQ is not set
CONFIG_BLK_DEV_IDEDMA_PCI=y CONFIG_BLK_DEV_IDEDMA_PCI=y
# CONFIG_BLK_DEV_OFFBOARD is not set
# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
CONFIG_IDEDMA_PCI_AUTO=y CONFIG_IDEDMA_PCI_AUTO=y
CONFIG_IDEDMA_ONLYDISK=y CONFIG_IDEDMA_ONLYDISK=y
CONFIG_BLK_DEV_IDEDMA=y CONFIG_BLK_DEV_IDEDMA=y
# CONFIG_BLK_DEV_IDE_TCQ is not set # CONFIG_IDEDMA_PCI_WIP is not set
# CONFIG_BLK_DEV_IDE_TCQ_DEFAULT is not set # CONFIG_BLK_DEV_IDEDMA_TIMEOUT is not set
# CONFIG_IDEDMA_NEW_DRIVE_LISTINGS is not set # CONFIG_IDEDMA_NEW_DRIVE_LISTINGS is not set
# CONFIG_BLK_DEV_AEC62XX is not set # CONFIG_BLK_DEV_AEC62XX is not set
# CONFIG_AEC6280_BURST is not set # CONFIG_AEC62XX_TUNING is not set
CONFIG_BLK_DEV_ALI15X3=y CONFIG_BLK_DEV_ALI15X3=y
# CONFIG_WDC_ALI15X3 is not set # CONFIG_WDC_ALI15X3 is not set
# CONFIG_BLK_DEV_AMD74XX is not set # CONFIG_BLK_DEV_AMD74XX is not set
# CONFIG_AMD74XX_OVERRIDE is not set
CONFIG_BLK_DEV_CMD64X=y CONFIG_BLK_DEV_CMD64X=y
# CONFIG_BLK_DEV_CMD680 is not set
# CONFIG_BLK_DEV_CY82C693 is not set # CONFIG_BLK_DEV_CY82C693 is not set
# CONFIG_BLK_DEV_CS5530 is not set # CONFIG_BLK_DEV_CS5530 is not set
# CONFIG_BLK_DEV_HPT34X is not set # CONFIG_BLK_DEV_HPT34X is not set
# CONFIG_HPT34X_AUTODMA is not set # CONFIG_HPT34X_AUTODMA is not set
# CONFIG_BLK_DEV_HPT366 is not set # CONFIG_BLK_DEV_HPT366 is not set
# CONFIG_BLK_DEV_PIIX is not set
CONFIG_BLK_DEV_NS87415=y CONFIG_BLK_DEV_NS87415=y
# CONFIG_BLK_DEV_OPTI621 is not set # CONFIG_BLK_DEV_OPTI621 is not set
# CONFIG_BLK_DEV_ADMA100 is not set
# CONFIG_BLK_DEV_PDC202XX is not set # CONFIG_BLK_DEV_PDC202XX is not set
# CONFIG_PDC202XX_BURST is not set # CONFIG_PDC202XX_BURST is not set
# CONFIG_PDC202XX_FORCE is not set # CONFIG_PDC202XX_FORCE is not set
# CONFIG_BLK_DEV_RZ1000 is not set
# CONFIG_BLK_DEV_SVWKS is not set # CONFIG_BLK_DEV_SVWKS is not set
# CONFIG_BLK_DEV_SIS5513 is not set # CONFIG_BLK_DEV_SIS5513 is not set
# CONFIG_BLK_DEV_SLC90E66 is not set
# CONFIG_BLK_DEV_TRM290 is not set # CONFIG_BLK_DEV_TRM290 is not set
# CONFIG_BLK_DEV_VIA82CXXX is not set # CONFIG_BLK_DEV_VIA82CXXX is not set
# CONFIG_BLK_DEV_SL82C105 is not set
# CONFIG_IDE_CHIPSETS is not set # CONFIG_IDE_CHIPSETS is not set
# CONFIG_IDEDMA_IVB is not set
CONFIG_IDEDMA_AUTO=y CONFIG_IDEDMA_AUTO=y
# CONFIG_BLK_DEV_ATARAID is not set # CONFIG_IDEDMA_IVB is not set
# CONFIG_BLK_DEV_ATARAID_PDC is not set # CONFIG_DMA_NONPCI is not set
# CONFIG_BLK_DEV_ATARAID_HPT is not set CONFIG_BLK_DEV_IDE_MODES=y
# #
# SCSI support # SCSI support
...@@ -475,7 +491,7 @@ CONFIG_8139TOO=m ...@@ -475,7 +491,7 @@ CONFIG_8139TOO=m
# CONFIG_8139TOO_PIO is not set # CONFIG_8139TOO_PIO is not set
# CONFIG_8139TOO_TUNE_TWISTER is not set # CONFIG_8139TOO_TUNE_TWISTER is not set
# CONFIG_8139TOO_8129 is not set # CONFIG_8139TOO_8129 is not set
# CONFIG_8139_NEW_RX_RESET is not set # CONFIG_8139_OLD_RX_RESET is not set
CONFIG_SIS900=m CONFIG_SIS900=m
CONFIG_EPIC100=m CONFIG_EPIC100=m
CONFIG_SUNDANCE=m CONFIG_SUNDANCE=m
...@@ -490,6 +506,7 @@ CONFIG_VIA_RHINE=m ...@@ -490,6 +506,7 @@ CONFIG_VIA_RHINE=m
# CONFIG_ACENIC is not set # CONFIG_ACENIC is not set
# CONFIG_DL2K is not set # CONFIG_DL2K is not set
# CONFIG_E1000 is not set # CONFIG_E1000 is not set
# CONFIG_E1000_NAPI is not set
CONFIG_MYRI_SBUS=m CONFIG_MYRI_SBUS=m
# CONFIG_NS83820 is not set # CONFIG_NS83820 is not set
CONFIG_HAMACHI=m CONFIG_HAMACHI=m
...@@ -574,7 +591,6 @@ CONFIG_INPUT=y ...@@ -574,7 +591,6 @@ CONFIG_INPUT=y
# #
# Userland interfaces # Userland interfaces
# #
CONFIG_INPUT_KEYBDEV=y
CONFIG_INPUT_MOUSEDEV=y CONFIG_INPUT_MOUSEDEV=y
CONFIG_INPUT_MOUSEDEV_PSAUX=y CONFIG_INPUT_MOUSEDEV_PSAUX=y
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024 CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
...@@ -583,7 +599,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768 ...@@ -583,7 +599,6 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
# CONFIG_INPUT_TSDEV is not set # CONFIG_INPUT_TSDEV is not set
CONFIG_INPUT_EVDEV=y CONFIG_INPUT_EVDEV=y
# CONFIG_INPUT_EVBUG is not set # CONFIG_INPUT_EVBUG is not set
# CONFIG_INPUT_UINPUT is not set
# #
# Input I/O drivers # Input I/O drivers
...@@ -597,7 +612,10 @@ CONFIG_SOUND_GAMEPORT=y ...@@ -597,7 +612,10 @@ CONFIG_SOUND_GAMEPORT=y
# CONFIG_GAMEPORT_FM801 is not set # CONFIG_GAMEPORT_FM801 is not set
# CONFIG_GAMEPORT_CS461x is not set # CONFIG_GAMEPORT_CS461x is not set
CONFIG_SERIO=y CONFIG_SERIO=y
# CONFIG_SERIO_I8042 is not set CONFIG_SERIO_I8042=y
CONFIG_I8042_REG_BASE=60
CONFIG_I8042_KBD_IRQ=1
CONFIG_I8042_AUX_IRQ=12
# CONFIG_SERIO_SERPORT is not set # CONFIG_SERIO_SERPORT is not set
# CONFIG_SERIO_CT82C710 is not set # CONFIG_SERIO_CT82C710 is not set
# CONFIG_SERIO_PARKBD is not set # CONFIG_SERIO_PARKBD is not set
...@@ -606,12 +624,12 @@ CONFIG_SERIO=y ...@@ -606,12 +624,12 @@ CONFIG_SERIO=y
# Input Device Drivers # Input Device Drivers
# #
CONFIG_INPUT_KEYBOARD=y CONFIG_INPUT_KEYBOARD=y
# CONFIG_KEYBOARD_ATKBD is not set CONFIG_KEYBOARD_ATKBD=y
CONFIG_KEYBOARD_SUNKBD=y CONFIG_KEYBOARD_SUNKBD=y
# CONFIG_KEYBOARD_XTKBD is not set # CONFIG_KEYBOARD_XTKBD is not set
# CONFIG_KEYBOARD_NEWTON is not set # CONFIG_KEYBOARD_NEWTON is not set
CONFIG_INPUT_MOUSE=y CONFIG_INPUT_MOUSE=y
# CONFIG_MOUSE_PS2 is not set CONFIG_MOUSE_PS2=y
CONFIG_MOUSE_SERIAL=y CONFIG_MOUSE_SERIAL=y
# CONFIG_MOUSE_INPORT is not set # CONFIG_MOUSE_INPORT is not set
# CONFIG_MOUSE_LOGIBM is not set # CONFIG_MOUSE_LOGIBM is not set
...@@ -641,6 +659,10 @@ CONFIG_MOUSE_SERIAL=y ...@@ -641,6 +659,10 @@ CONFIG_MOUSE_SERIAL=y
# CONFIG_INPUT_JOYDUMP is not set # CONFIG_INPUT_JOYDUMP is not set
# CONFIG_INPUT_TOUCHSCREEN is not set # CONFIG_INPUT_TOUCHSCREEN is not set
# CONFIG_TOUCHSCREEN_GUNZE is not set # CONFIG_TOUCHSCREEN_GUNZE is not set
CONFIG_INPUT_MISC=y
# CONFIG_INPUT_PCSPKR is not set
CONFIG_INPUT_SPARCSPKR=y
# CONFIG_INPUT_UINPUT is not set
# #
# File systems # File systems
...@@ -924,6 +946,8 @@ CONFIG_USB_SERIAL_OMNINET=m ...@@ -924,6 +946,8 @@ CONFIG_USB_SERIAL_OMNINET=m
CONFIG_USB_AUERSWALD=m CONFIG_USB_AUERSWALD=m
CONFIG_USB_RIO500=m CONFIG_USB_RIO500=m
# CONFIG_USB_BRLVGER is not set # CONFIG_USB_BRLVGER is not set
CONFIG_USB_LCD=m
CONFIG_USB_SPEEDTOUCH=m
# #
# Bluetooth support # Bluetooth support
......
...@@ -57,25 +57,24 @@ unsigned int fsr_storage; ...@@ -57,25 +57,24 @@ unsigned int fsr_storage;
void __init cpu_probe(void) void __init cpu_probe(void)
{ {
int manuf, impl; unsigned long ver, fpu_vers, manuf, impl, fprs;
unsigned i, cpuid; int i, cpuid;
long ver, fpu_vers;
long fprs;
cpuid = hard_smp_processor_id(); cpuid = hard_smp_processor_id();
fprs = fprs_read (); fprs = fprs_read();
fprs_write (FPRS_FEF); fprs_write(FPRS_FEF);
__asm__ __volatile__ ("rdpr %%ver, %0; stx %%fsr, [%1]" __asm__ __volatile__ ("rdpr %%ver, %0; stx %%fsr, [%1]"
: "=&r" (ver) : "=&r" (ver)
: "r" (&fpu_vers)); : "r" (&fpu_vers));
fprs_write (fprs); fprs_write(fprs);
manuf = ((ver >> 48) & 0xffff); manuf = ((ver >> 48) & 0xffff);
impl = ((ver >> 32) & 0xffff); impl = ((ver >> 32) & 0xffff);
fpu_vers = ((fpu_vers >> 17) & 0x7); fpu_vers = ((fpu_vers >> 17) & 0x7);
retry:
for (i = 0; i < NSPARCCHIPS; i++) { for (i = 0; i < NSPARCCHIPS; i++) {
if (linux_sparc_chips[i].manuf == manuf) { if (linux_sparc_chips[i].manuf == manuf) {
if (linux_sparc_chips[i].impl == impl) { if (linux_sparc_chips[i].impl == impl) {
...@@ -87,8 +86,17 @@ void __init cpu_probe(void) ...@@ -87,8 +86,17 @@ void __init cpu_probe(void)
} }
if (i == NSPARCCHIPS) { if (i == NSPARCCHIPS) {
printk("DEBUG: manuf = 0x%x impl = 0x%x\n", /* Maybe it is a cheetah+ derivative, report it as cheetah+
* in that case until we learn the real names.
*/
if (manuf == 0x3e &&
impl > 0x15) {
impl = 0x15;
goto retry;
} else {
printk("DEBUG: manuf[%lx] impl[%lx]\n",
manuf, impl); manuf, impl);
}
sparc_cpu_type[cpuid] = "Unknown CPU"; sparc_cpu_type[cpuid] = "Unknown CPU";
} }
...@@ -104,9 +112,8 @@ void __init cpu_probe(void) ...@@ -104,9 +112,8 @@ void __init cpu_probe(void)
} }
if (i == NSPARCFPU) { if (i == NSPARCFPU) {
printk("DEBUG: manuf = 0x%x impl = 0x%x fsr.vers = 0x%x\n", printk("DEBUG: manuf[%lx] impl[%lx] fsr.vers[%lx]\n",
manuf, impl, manuf, impl, fpu_vers);
(unsigned int) fpu_vers);
sparc_fpu_type[cpuid] = "Unknown FPU"; sparc_fpu_type[cpuid] = "Unknown FPU";
} }
} }
...@@ -1820,23 +1820,13 @@ do_gettimeofday: /* %o0 = timevalp */ ...@@ -1820,23 +1820,13 @@ do_gettimeofday: /* %o0 = timevalp */
ldx [%g3 + %lo(timer_tick_offset)], %g3 ldx [%g3 + %lo(timer_tick_offset)], %g3
or %g2, %lo(xtime), %g2 or %g2, %lo(xtime), %g2
or %g1, %lo(timer_tick_compare), %g1 or %g1, %lo(timer_tick_compare), %g1
1: rdpr %ver, %o2 1: membar #Sync
sethi %hi(CHEETAH_ID), %o1
srlx %o2, 32, %o2
or %o1, %lo(CHEETAH_ID), %o1
membar #Sync
ldda [%g2] ASI_NUCLEUS_QUAD_LDD, %o4 ldda [%g2] ASI_NUCLEUS_QUAD_LDD, %o4
cmp %o2, %o1 BRANCH_IF_ANY_CHEETAH(o2,o1,2f)
be,a,pn %xcc, 3f
rd %asr24, %o1
sethi %hi(CHEETAH_PLUS_ID), %o1
or %o1, %lo(CHEETAH_PLUS_ID), %o1
cmp %o2, %o1
bne,pt %xcc, 2f
nop
ba,pt %xcc, 3f ba,pt %xcc, 3f
rd %tick, %o1
2: ba,pt %xcc, 3f
rd %asr24, %o1 rd %asr24, %o1
2: rd %tick, %o1
3: ldx [%g1], %g7 3: ldx [%g1], %g7
membar #Sync membar #Sync
ldda [%g2] ASI_NUCLEUS_QUAD_LDD, %o2 ldda [%g2] ASI_NUCLEUS_QUAD_LDD, %o2
......
...@@ -115,11 +115,12 @@ etraptl1: /* Save tstate/tpc/tnpc of TL 1-->4 and the tl register itself. ...@@ -115,11 +115,12 @@ etraptl1: /* Save tstate/tpc/tnpc of TL 1-->4 and the tl register itself.
* 0x00 TL1's TSTATE * 0x00 TL1's TSTATE
* 0x08 TL1's TPC * 0x08 TL1's TPC
* 0x10 TL1's TNPC * 0x10 TL1's TNPC
* 0x18 TL1's TT
* ... * ...
* 0x58 TL4's TNPC * 0x58 TL4's TT
* 0x60 TL * 0x60 TL
*/ */
sub %sp, (24 * 8) + 8, %g2 sub %sp, ((4 * 8) * 4) + 8, %g2
rdpr %tl, %g1 rdpr %tl, %g1
wrpr %g0, 1, %tl wrpr %g0, 1, %tl
...@@ -129,33 +130,41 @@ etraptl1: /* Save tstate/tpc/tnpc of TL 1-->4 and the tl register itself. ...@@ -129,33 +130,41 @@ etraptl1: /* Save tstate/tpc/tnpc of TL 1-->4 and the tl register itself.
stx %g3, [%g2 + STACK_BIAS + 0x08] stx %g3, [%g2 + STACK_BIAS + 0x08]
rdpr %tnpc, %g3 rdpr %tnpc, %g3
stx %g3, [%g2 + STACK_BIAS + 0x10] stx %g3, [%g2 + STACK_BIAS + 0x10]
rdpr %tt, %g3
stx %g3, [%g2 + STACK_BIAS + 0x18]
wrpr %g0, 2, %tl wrpr %g0, 2, %tl
rdpr %tstate, %g3 rdpr %tstate, %g3
stx %g3, [%g2 + STACK_BIAS + 0x18]
rdpr %tpc, %g3
stx %g3, [%g2 + STACK_BIAS + 0x20] stx %g3, [%g2 + STACK_BIAS + 0x20]
rdpr %tnpc, %g3 rdpr %tpc, %g3
stx %g3, [%g2 + STACK_BIAS + 0x28] stx %g3, [%g2 + STACK_BIAS + 0x28]
rdpr %tnpc, %g3
stx %g3, [%g2 + STACK_BIAS + 0x30]
rdpr %tt, %g3
stx %g3, [%g2 + STACK_BIAS + 0x38]
wrpr %g0, 3, %tl wrpr %g0, 3, %tl
rdpr %tstate, %g3 rdpr %tstate, %g3
stx %g3, [%g2 + STACK_BIAS + 0x30] stx %g3, [%g2 + STACK_BIAS + 0x40]
rdpr %tpc, %g3 rdpr %tpc, %g3
stx %g3, [%g2 + STACK_BIAS + 0x38] stx %g3, [%g2 + STACK_BIAS + 0x48]
rdpr %tnpc, %g3 rdpr %tnpc, %g3
stx %g3, [%g2 + STACK_BIAS + 0x40] stx %g3, [%g2 + STACK_BIAS + 0x50]
rdpr %tt, %g3
stx %g3, [%g2 + STACK_BIAS + 0x58]
wrpr %g0, 4, %tl wrpr %g0, 4, %tl
rdpr %tstate, %g3 rdpr %tstate, %g3
stx %g3, [%g2 + STACK_BIAS + 0x48] stx %g3, [%g2 + STACK_BIAS + 0x60]
rdpr %tpc, %g3 rdpr %tpc, %g3
stx %g3, [%g2 + STACK_BIAS + 0x50] stx %g3, [%g2 + STACK_BIAS + 0x68]
rdpr %tnpc, %g3 rdpr %tnpc, %g3
stx %g3, [%g2 + STACK_BIAS + 0x58] stx %g3, [%g2 + STACK_BIAS + 0x70]
rdpr %tt, %g3
stx %g3, [%g2 + STACK_BIAS + 0x78]
wrpr %g1, %tl wrpr %g1, %tl
stx %g1, [%g2 + STACK_BIAS + 0x60] stx %g1, [%g2 + STACK_BIAS + 0x80]
rdpr %tstate, %g1 ! Single Group+4bubbles rdpr %tstate, %g1 ! Single Group+4bubbles
sub %g2, REGWIN_SZ + TRACEREG_SZ - STACK_BIAS, %g2 ! IEU1 sub %g2, REGWIN_SZ + TRACEREG_SZ - STACK_BIAS, %g2 ! IEU1
......
...@@ -78,16 +78,9 @@ sparc_ramdisk_size: ...@@ -78,16 +78,9 @@ sparc_ramdisk_size:
* PROM entry point is on %o4 * PROM entry point is on %o4
*/ */
sparc64_boot: sparc64_boot:
rdpr %ver, %g1 BRANCH_IF_CHEETAH_BASE(g1,g5,cheetah_boot)
sethi %hi(CHEETAH_ID), %g5 BRANCH_IF_CHEETAH_PLUS_OR_FOLLOWON(g1,g5,cheetah_plus_boot)
srlx %g1, 32, %g1 ba,pt %xcc, spitfire_boot
or %g5, %lo(CHEETAH_ID), %g5
cmp %g1, %g5
be,pn %icc, cheetah_boot
sethi %hi(CHEETAH_PLUS_ID), %g5
or %g5, %lo(CHEETAH_PLUS_ID), %g5
cmp %g1, %g5
bne,pt %icc, spitfire_boot
nop nop
cheetah_plus_boot: cheetah_plus_boot:
...@@ -212,15 +205,11 @@ cheetah_got_tlbentry: ...@@ -212,15 +205,11 @@ cheetah_got_tlbentry:
add %l0, (1 << 3), %l0 add %l0, (1 << 3), %l0
/* On Cheetah+, have to check second DTLB. */ /* On Cheetah+, have to check second DTLB. */
rdpr %ver, %g1 BRANCH_IF_CHEETAH_PLUS_OR_FOLLOWON(g1,l0,2f)
srlx %g1, 32, %g1 ba,pt %xcc, 9f
sethi %hi(CHEETAH_PLUS_ID), %l0
or %l0, %lo(CHEETAH_PLUS_ID), %l0
cmp %g1, %l0
bne,pt %icc, 9f
nop nop
set 3 << 16, %l0 2: set 3 << 16, %l0
1: ldxa [%l0] ASI_DTLB_TAG_READ, %g1 1: ldxa [%l0] ASI_DTLB_TAG_READ, %g1
membar #Sync membar #Sync
andn %g1, %l2, %g1 andn %g1, %l2, %g1
...@@ -469,16 +458,9 @@ sun4u_init: ...@@ -469,16 +458,9 @@ sun4u_init:
stxa %g3, [%g2] ASI_DMMU stxa %g3, [%g2] ASI_DMMU
membar #Sync membar #Sync
rdpr %ver, %g1 BRANCH_IF_ANY_CHEETAH(g1,g5,cheetah_tlb_fixup)
sethi %hi(CHEETAH_ID), %g5
srlx %g1, 32, %g1 ba,pt %xcc, spitfire_tlb_fixup
or %g5, %lo(CHEETAH_ID), %g5
cmp %g1, %g5
be,pn %icc, cheetah_tlb_fixup
sethi %hi(CHEETAH_PLUS_ID), %g5
or %g5, %lo(CHEETAH_PLUS_ID), %g5
cmp %g1, %g5
bne,pt %icc, spitfire_tlb_fixup
nop nop
cheetah_tlb_fixup: cheetah_tlb_fixup:
...@@ -499,15 +481,10 @@ cheetah_tlb_fixup: ...@@ -499,15 +481,10 @@ cheetah_tlb_fixup:
flush %g3 flush %g3
membar #Sync membar #Sync
sethi %hi(CHEETAH_PLUS_ID), %g5
or %g5, %lo(CHEETAH_PLUS_ID), %g5
rdpr %ver, %g2
srlx %g2, 32, %g2
cmp %g2, %g5
bne,a,pt %icc, 1f
mov 1, %g2 /* Set TLB type to cheetah. */
mov 2, %g2 /* Set TLB type to cheetah+. */ mov 2, %g2 /* Set TLB type to cheetah+. */
BRANCH_IF_CHEETAH_PLUS_OR_FOLLOWON(g5,g2,1f)
mov 1, %g2 /* Set TLB type to cheetah. */
1: sethi %hi(tlb_type), %g5 1: sethi %hi(tlb_type), %g5
stw %g2, [%g5 + %lo(tlb_type)] stw %g2, [%g5 + %lo(tlb_type)]
...@@ -631,16 +608,8 @@ setup_tba: /* i0 = is_starfire */ ...@@ -631,16 +608,8 @@ setup_tba: /* i0 = is_starfire */
sllx %g2, 32, %g2 sllx %g2, 32, %g2
or %g2, KERN_LOWBITS, %g2 or %g2, KERN_LOWBITS, %g2
rdpr %ver, %g3 BRANCH_IF_ANY_CHEETAH(g3,g7,cheetah_vpte_base)
sethi %hi(CHEETAH_ID), %g7 ba,pt %xcc, spitfire_vpte_base
srlx %g3, 32, %g3
or %g7, %lo(CHEETAH_ID), %g7
cmp %g3, %g7
be,pn %icc, cheetah_vpte_base
sethi %hi(CHEETAH_PLUS_ID), %g7
or %g7, %lo(CHEETAH_PLUS_ID), %g7
cmp %g3, %g7
bne,pt %icc, spitfire_vpte_base
nop nop
cheetah_vpte_base: cheetah_vpte_base:
...@@ -648,6 +617,7 @@ cheetah_vpte_base: ...@@ -648,6 +617,7 @@ cheetah_vpte_base:
or %g3, %ulo(VPTE_BASE_CHEETAH), %g3 or %g3, %ulo(VPTE_BASE_CHEETAH), %g3
ba,pt %xcc, 2f ba,pt %xcc, 2f
sllx %g3, 32, %g3 sllx %g3, 32, %g3
spitfire_vpte_base: spitfire_vpte_base:
sethi %uhi(VPTE_BASE_SPITFIRE), %g3 sethi %uhi(VPTE_BASE_SPITFIRE), %g3
or %g3, %ulo(VPTE_BASE_SPITFIRE), %g3 or %g3, %ulo(VPTE_BASE_SPITFIRE), %g3
...@@ -675,16 +645,9 @@ spitfire_vpte_base: ...@@ -675,16 +645,9 @@ spitfire_vpte_base:
nop nop
not_starfire: not_starfire:
rdpr %ver, %g1 BRANCH_IF_ANY_CHEETAH(g1,g5,is_cheetah)
sethi %hi(CHEETAH_ID), %g5
srlx %g1, 32, %g1 ba,pt %xcc, not_cheetah
or %g5, %lo(CHEETAH_ID), %g5
cmp %g1, %g5
be,pn %icc, is_cheetah
sethi %hi(CHEETAH_PLUS_ID), %g5
or %g5, %lo(CHEETAH_PLUS_ID), %g5
cmp %g1, %g5
bne,pt %icc, not_cheetah
nop nop
is_cheetah: is_cheetah:
...@@ -710,16 +673,9 @@ set_worklist: ...@@ -710,16 +673,9 @@ set_worklist:
/* Kill PROM timer */ /* Kill PROM timer */
wr %g0, 0, %tick_cmpr wr %g0, 0, %tick_cmpr
rdpr %ver, %g1 BRANCH_IF_ANY_CHEETAH(g1,g5,1f)
sethi %hi(CHEETAH_ID), %g5
srlx %g1, 32, %g1 ba,pt %xcc, 2f
or %g5, %lo(CHEETAH_ID), %g5
cmp %g1, %g5
be,pn %icc, 1f
sethi %hi(CHEETAH_PLUS_ID), %g5
or %g5, %lo(CHEETAH_PLUS_ID), %g5
cmp %g1, %g5
bne,pt %icc, 2f
nop nop
/* Disable STICK_INT interrupts. */ /* Disable STICK_INT interrupts. */
......
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/seq_file.h> #include <linux/seq_file.h>
#include <linux/kbd_ll.h>
#include <asm/ptrace.h> #include <asm/ptrace.h>
#include <asm/processor.h> #include <asm/processor.h>
......
...@@ -705,19 +705,5 @@ void sun_do_break(void) ...@@ -705,19 +705,5 @@ void sun_do_break(void)
prom_cmdline(); prom_cmdline();
} }
#ifdef CONFIG_MAGIC_SYSRQ
/* Because we use the generic input layer keyboard drivers for
* everything, this PC sysrq translation table is all we need.
*/
unsigned char kbd_sysrq_xlate[128] =
"\000\0331234567890-=\177\t" /* 0x00 - 0x0f */
"qwertyuiop[]\r\000as" /* 0x10 - 0x1f */
"dfghjkl;'`\000\\zxcv" /* 0x20 - 0x2f */
"bnm,./\000*\000 \000\201\202\203\204\205" /* 0x30 - 0x3f */
"\206\207\210\211\212\000\000789-456+1" /* 0x40 - 0x4f */
"230\177\000\000\213\214\000\000\000\000\000\000\000\000\000\000" /* 0x50 - 0x5f */
"\r\000/"; /* 0x60 - 0x6f */
#endif
int serial_console; int serial_console;
int stop_a_enabled = 1; int stop_a_enabled = 1;
...@@ -33,16 +33,10 @@ dtlb_load: ...@@ -33,16 +33,10 @@ dtlb_load:
sparc64_cpu_startup: sparc64_cpu_startup:
flushw flushw
rdpr %ver, %g1 BRANCH_IF_CHEETAH_BASE(g1,g5,cheetah_startup)
sethi %hi(CHEETAH_ID), %g5 BRANCH_IF_CHEETAH_PLUS_OR_FOLLOWON(g1,g5,cheetah_plus_startup)
srlx %g1, 32, %g1
or %g5, %lo(CHEETAH_ID), %g5 ba,pt %xcc, spitfire_startup
cmp %g1, %g5
be,pn %icc, cheetah_startup
sethi %hi(CHEETAH_PLUS_ID), %g5
or %g5, %lo(CHEETAH_PLUS_ID), %g5
cmp %g1, %g5
bne,pt %icc, spitfire_startup
nop nop
cheetah_plus_startup: cheetah_plus_startup:
...@@ -54,8 +48,8 @@ cheetah_startup: ...@@ -54,8 +48,8 @@ cheetah_startup:
mov DCR_BPE | DCR_RPE | DCR_SI | DCR_IFPOE | DCR_MS, %g1 mov DCR_BPE | DCR_RPE | DCR_SI | DCR_IFPOE | DCR_MS, %g1
wr %g1, %asr18 wr %g1, %asr18
sethi %uhi(DCU_ME | DCU_RE | /*DCU_PE |*/ DCU_HPE | DCU_SPE | DCU_SL | DCU_WE), %g5 sethi %uhi(DCU_ME|DCU_RE|DCU_HPE|DCU_SPE|DCU_SL|DCU_WE), %g5
or %g5, %ulo(DCU_ME | DCU_RE | /*DCU_PE |*/ DCU_HPE | DCU_SPE | DCU_SL | DCU_WE), %g5 or %g5, %ulo(DCU_ME|DCU_RE|DCU_HPE|DCU_SPE|DCU_SL|DCU_WE), %g5
sllx %g5, 32, %g5 sllx %g5, 32, %g5
or %g5, DCU_DM | DCU_IM | DCU_DC | DCU_IC, %g5 or %g5, DCU_DM | DCU_IM | DCU_DC | DCU_IC, %g5
stxa %g5, [%g0] ASI_DCU_CONTROL_REG stxa %g5, [%g0] ASI_DCU_CONTROL_REG
...@@ -127,19 +121,10 @@ startup_continue: ...@@ -127,19 +121,10 @@ startup_continue:
ldx [%g2 + %lo(kern_locked_tte_data)], %g2 ldx [%g2 + %lo(kern_locked_tte_data)], %g2
stx %g2, [%sp + 2047 + 128 + 0x30] stx %g2, [%sp + 2047 + 128 + 0x30]
rdpr %ver, %g1
sethi %hi(CHEETAH_ID), %g5
srlx %g1, 32, %g1
or %g5, %lo(CHEETAH_ID), %g5
cmp %g1, %g5
be,a,pn %icc, 1f
mov 15, %g2 mov 15, %g2
sethi %hi(CHEETAH_PLUS_ID), %g5 BRANCH_IF_ANY_CHEETAH(g1,g5,1f)
or %g5, %lo(CHEETAH_PLUS_ID), %g5
cmp %g1, %g5
bne,a,pt %icc, 1f
mov 63, %g2 mov 63, %g2
mov 15, %g2
1: 1:
stx %g2, [%sp + 2047 + 128 + 0x38] stx %g2, [%sp + 2047 + 128 + 0x38]
sethi %hi(p1275buf), %g2 sethi %hi(p1275buf), %g2
...@@ -167,19 +152,10 @@ startup_continue: ...@@ -167,19 +152,10 @@ startup_continue:
ldx [%g2 + %lo(kern_locked_tte_data)], %g2 ldx [%g2 + %lo(kern_locked_tte_data)], %g2
stx %g2, [%sp + 2047 + 128 + 0x30] stx %g2, [%sp + 2047 + 128 + 0x30]
rdpr %ver, %g1
sethi %hi(CHEETAH_ID), %g5
srlx %g1, 32, %g1
or %g5, %lo(CHEETAH_ID), %g5
cmp %g1, %g5
be,a,pn %icc, 1f
mov 15, %g2 mov 15, %g2
sethi %hi(CHEETAH_PLUS_ID), %g5 BRANCH_IF_ANY_CHEETAH(g1,g5,1f)
or %g5, %lo(CHEETAH_PLUS_ID), %g5
cmp %g1, %g5
bne,a,pt %icc, 1f
mov 63, %g2 mov 63, %g2
mov 15, %g2
1: 1:
stx %g2, [%sp + 2047 + 128 + 0x38] stx %g2, [%sp + 2047 + 128 + 0x38]
...@@ -244,16 +220,9 @@ startup_continue: ...@@ -244,16 +220,9 @@ startup_continue:
sllx %g2, 32, %g2 sllx %g2, 32, %g2
or %g2, KERN_LOWBITS, %g2 or %g2, KERN_LOWBITS, %g2
rdpr %ver, %g3 BRANCH_IF_ANY_CHEETAH(g3,g7,9f)
sethi %hi(CHEETAH_ID), %g7
srlx %g3, 32, %g3 ba,pt %xcc, 1f
or %g7, %lo(CHEETAH_ID), %g7
cmp %g3, %g7
be,pn %icc, 9f
sethi %hi(CHEETAH_PLUS_ID), %g7
or %g7, %lo(CHEETAH_PLUS_ID), %g7
cmp %g3, %g7
bne,pt %icc, 1f
nop nop
9: 9:
......
...@@ -47,6 +47,7 @@ struct tl1_traplog { ...@@ -47,6 +47,7 @@ struct tl1_traplog {
unsigned long tstate; unsigned long tstate;
unsigned long tpc; unsigned long tpc;
unsigned long tnpc; unsigned long tnpc;
unsigned long tt;
} trapstack[4]; } trapstack[4];
unsigned long tl; unsigned long tl;
}; };
...@@ -58,9 +59,12 @@ static void dump_tl1_traplog(struct tl1_traplog *p) ...@@ -58,9 +59,12 @@ static void dump_tl1_traplog(struct tl1_traplog *p)
printk("TRAPLOG: Error at trap level 0x%lx, dumping track stack.\n", printk("TRAPLOG: Error at trap level 0x%lx, dumping track stack.\n",
p->tl); p->tl);
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
printk("TRAPLOG: Trap level %d TSTATE[%016lx] TPC[%016lx] TNPC[%016lx]\n", printk(KERN_CRIT
"TRAPLOG: Trap level %d TSTATE[%016lx] TPC[%016lx] "
"TNPC[%016lx] TT[%lx]\n",
i + 1, i + 1,
p->trapstack[i].tstate, p->trapstack[i].tpc, p->trapstack[i].tnpc); p->trapstack[i].tstate, p->trapstack[i].tpc,
p->trapstack[i].tnpc, p->trapstack[i].tt);
} }
} }
...@@ -182,11 +186,13 @@ extern volatile int pci_poke_faulted; ...@@ -182,11 +186,13 @@ extern volatile int pci_poke_faulted;
#endif #endif
/* When access exceptions happen, we must do this. */ /* When access exceptions happen, we must do this. */
static void clean_and_reenable_l1_caches(void) static void spitfire_clean_and_reenable_l1_caches(void)
{ {
unsigned long va; unsigned long va;
if (tlb_type == spitfire) { if (tlb_type != spitfire)
BUG();
/* Clean 'em. */ /* Clean 'em. */
for (va = 0; va < (PAGE_SIZE << 1); va += 32) { for (va = 0; va < (PAGE_SIZE << 1); va += 32) {
spitfire_put_icache_tag(va, 0x0); spitfire_put_icache_tag(va, 0x0);
...@@ -203,22 +209,13 @@ static void clean_and_reenable_l1_caches(void) ...@@ -203,22 +209,13 @@ static void clean_and_reenable_l1_caches(void)
LSU_CONTROL_IM | LSU_CONTROL_DM), LSU_CONTROL_IM | LSU_CONTROL_DM),
"i" (ASI_LSU_CONTROL) "i" (ASI_LSU_CONTROL)
: "memory"); : "memory");
} else if (tlb_type == cheetah || tlb_type == cheetah_plus) {
/* Flush D-cache */
for (va = 0; va < (1 << 16); va += (1 << 5)) {
__asm__ __volatile__("stxa %%g0, [%0] %1\n\t"
"membar #Sync"
: /* no outputs */
: "r" (va), "i" (ASI_DCACHE_TAG));
}
}
} }
void do_iae(struct pt_regs *regs) void do_iae(struct pt_regs *regs)
{ {
siginfo_t info; siginfo_t info;
clean_and_reenable_l1_caches(); spitfire_clean_and_reenable_l1_caches();
info.si_signo = SIGBUS; info.si_signo = SIGBUS;
info.si_errno = 0; info.si_errno = 0;
...@@ -232,7 +229,7 @@ void do_dae(struct pt_regs *regs) ...@@ -232,7 +229,7 @@ void do_dae(struct pt_regs *regs)
{ {
#ifdef CONFIG_PCI #ifdef CONFIG_PCI
if (pci_poke_in_progress && pci_poke_cpu == smp_processor_id()) { if (pci_poke_in_progress && pci_poke_cpu == smp_processor_id()) {
clean_and_reenable_l1_caches(); spitfire_clean_and_reenable_l1_caches();
pci_poke_faulted = 1; pci_poke_faulted = 1;
......
...@@ -106,13 +106,8 @@ cheetah_patch_1: ...@@ -106,13 +106,8 @@ cheetah_patch_1:
bne,pn %xcc, copy_page_using_blkcommit bne,pn %xcc, copy_page_using_blkcommit
nop nop
rdpr %ver, %g3 BRANCH_IF_ANY_CHEETAH(g3,o2,cheetah_copy_user_page)
sllx %g3, 16, %g3 ba,pt %xcc, spitfire_copy_user_page
srlx %g3, 32 + 16, %g3
cmp %g3, 0x14 ! CHEETAH_ID
be,pn %icc, cheetah_copy_user_page
cmp %g3, 0x15 ! CHEETAH_PLUS_ID
bne,pt %icc, spitfire_copy_user_page
nop nop
cheetah_copy_user_page: cheetah_copy_user_page:
......
...@@ -906,7 +906,7 @@ static void kbd_bh(unsigned long dummy) ...@@ -906,7 +906,7 @@ static void kbd_bh(unsigned long dummy)
DECLARE_TASKLET_DISABLED(keyboard_tasklet, kbd_bh, 0); DECLARE_TASKLET_DISABLED(keyboard_tasklet, kbd_bh, 0);
#if defined(CONFIG_X86) || defined(CONFIG_IA64) || defined(CONFIG_ALPHA) || defined(CONFIG_MIPS) || defined(CONFIG_PPC) #if defined(CONFIG_X86) || defined(CONFIG_IA64) || defined(CONFIG_ALPHA) || defined(CONFIG_MIPS) || defined(CONFIG_PPC) || defined(CONFIG_SPARC32) || defined(CONFIG_SPARC64)
static unsigned short x86_keycodes[256] = static unsigned short x86_keycodes[256] =
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
...@@ -929,6 +929,11 @@ static unsigned short x86_keycodes[256] = ...@@ -929,6 +929,11 @@ static unsigned short x86_keycodes[256] =
extern int mac_hid_mouse_emulate_buttons(int, int, int); extern int mac_hid_mouse_emulate_buttons(int, int, int);
#endif /* CONFIG_MAC_EMUMOUSEBTN */ #endif /* CONFIG_MAC_EMUMOUSEBTN */
#if defined(CONFIG_SPARC32) || defined(CONFIG_SPARC64)
static int sparc_l1_a_state = 0;
extern void sun_do_break(void);
#endif
static int emulate_raw(struct vc_data *vc, unsigned int keycode, static int emulate_raw(struct vc_data *vc, unsigned int keycode,
unsigned char up_flag) unsigned char up_flag)
{ {
...@@ -1001,6 +1006,10 @@ void kbd_keycode(unsigned int keycode, int down) ...@@ -1001,6 +1006,10 @@ void kbd_keycode(unsigned int keycode, int down)
if (keycode == KEY_LEFTALT || keycode == KEY_RIGHTALT) if (keycode == KEY_LEFTALT || keycode == KEY_RIGHTALT)
sysrq_alt = down; sysrq_alt = down;
#if defined(CONFIG_SPARC32) || defined(CONFIG_SPARC64)
if (keycode == KEY_STOP)
sparc_l1_a_state = down;
#endif
rep = (down == 2); rep = (down == 2);
...@@ -1018,6 +1027,12 @@ void kbd_keycode(unsigned int keycode, int down) ...@@ -1018,6 +1027,12 @@ void kbd_keycode(unsigned int keycode, int down)
return; return;
} }
#endif #endif
#if defined(CONFIG_SPARC32) || defined(CONFIG_SPARC64)
if (keycode == KEY_A && sparc_l1_a_state) {
sparc_l1_a_state = 0;
sun_do_break();
}
#endif
if (kbd->kbdmode == VC_MEDIUMRAW) { if (kbd->kbdmode == VC_MEDIUMRAW) {
/* /*
......
...@@ -17,6 +17,17 @@ CONFIG_INPUT_PCSPKR ...@@ -17,6 +17,17 @@ CONFIG_INPUT_PCSPKR
The module will be called pcspkr.o. If you want to compile it as a The module will be called pcspkr.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>. module, say M here and read <file:Documentation/modules.txt>.
CONFIG_INPUT_SPARCSPKR
Say Y here if you want the standard Speaker on Sparc PCI systems
to be used for bells and whistles.
If unsure, say Y.
This driver is also available as a module ( = code which can be
inserted in and removed from the running kernel whenever you want).
The module will be called pcspkr.o. If you want to compile it as a
module, say M here and read <file:Documentation/modules.txt>.
CONFIG_INPUT_UINPUT CONFIG_INPUT_UINPUT
Say Y here if you want to support user level drivers for input Say Y here if you want to support user level drivers for input
......
...@@ -5,4 +5,7 @@ ...@@ -5,4 +5,7 @@
bool 'Misc' CONFIG_INPUT_MISC bool 'Misc' CONFIG_INPUT_MISC
dep_tristate ' PC Speaker support' CONFIG_INPUT_PCSPKR $CONFIG_INPUT $CONFIG_INPUT_MISC dep_tristate ' PC Speaker support' CONFIG_INPUT_PCSPKR $CONFIG_INPUT $CONFIG_INPUT_MISC
if [ "$CONFIG_SPARC32" = "y" -o "$CONFIG_SPARC64" = "y" ]; then
dep_tristate ' SPARC Speaker support' CONFIG_INPUT_SPARCSPKR $CONFIG_INPUT $CONFIG_INPUT_MISC
fi
dep_tristate ' User level driver support' CONFIG_INPUT_UINPUT $CONFIG_INPUT $CONFIG_INPUT_MISC dep_tristate ' User level driver support' CONFIG_INPUT_UINPUT $CONFIG_INPUT $CONFIG_INPUT_MISC
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
# Each configuration option enables a list of files. # Each configuration option enables a list of files.
obj-$(CONFIG_INPUT_SPARCSPKR) += sparcspkr.o
obj-$(CONFIG_INPUT_PCSPKR) += pcspkr.o obj-$(CONFIG_INPUT_PCSPKR) += pcspkr.o
obj-$(CONFIG_INPUT_UINPUT) += uinput.o obj-$(CONFIG_INPUT_UINPUT) += uinput.o
......
/*
* Driver for PC-speaker like devices found on various Sparc systems.
*
* Copyright (c) 2002 Vojtech Pavlik
* Copyright (c) 2002 David S. Miller (davem@redhat.com)
*/
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/input.h>
#include <asm/io.h>
#include <asm/ebus.h>
#ifdef CONFIG_SPARC64
#include <asm/isa.h>
#endif
MODULE_AUTHOR("David S. Miller <davem@redhat.com>");
MODULE_DESCRIPTION("PC Speaker beeper driver");
MODULE_LICENSE("GPL");
static unsigned long beep_iobase;
static char *sparcspkr_isa_name = "Sparc ISA Speaker";
static char *sparcspkr_ebus_name = "Sparc EBUS Speaker";
static char *sparcspkr_phys = "sparc/input0";
static struct input_dev sparcspkr_dev;
spinlock_t beep_lock = SPIN_LOCK_UNLOCKED;
static void __init init_sparcspkr_struct(void)
{
sparcspkr_dev.evbit[0] = BIT(EV_SND);
sparcspkr_dev.sndbit[0] = BIT(SND_BELL) | BIT(SND_TONE);
sparcspkr_dev.phys = sparcspkr_phys;
sparcspkr_dev.id.bustype = BUS_ISA;
sparcspkr_dev.id.vendor = 0x001f;
sparcspkr_dev.id.product = 0x0001;
sparcspkr_dev.id.version = 0x0100;
}
static int ebus_spkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
{
unsigned int count = 0;
unsigned long flags;
if (type != EV_SND)
return -1;
switch (code) {
case SND_BELL: if (value) value = 1000;
case SND_TONE: break;
default: return -1;
}
if (value > 20 && value < 32767)
count = 1193182 / value;
spin_lock_irqsave(&beep_lock, flags);
/* EBUS speaker only has on/off state, the frequency does not
* appear to be programmable.
*/
if (count) {
if (beep_iobase & 0x2UL)
outb(1, beep_iobase);
else
outl(1, beep_iobase);
} else {
if (beep_iobase & 0x2UL)
outb(0, beep_iobase);
else
outl(0, beep_iobase);
}
spin_unlock_irqrestore(&beep_lock, flags);
return 0;
}
static int __init init_ebus_beep(struct linux_ebus_device *edev)
{
beep_iobase = edev->resource[0].start;
init_sparcspkr_struct();
sparcspkr_dev.name = sparcspkr_ebus_name;
sparcspkr_dev.event = ebus_spkr_event;
input_register_device(&sparcspkr_dev);
printk(KERN_INFO "input: %s\n", sparcspkr_ebus_name);
return 0;
}
#ifdef CONFIG_SPARC64
static int isa_spkr_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
{
unsigned int count = 0;
unsigned long flags;
if (type != EV_SND)
return -1;
switch (code) {
case SND_BELL: if (value) value = 1000;
case SND_TONE: break;
default: return -1;
}
if (value > 20 && value < 32767)
count = 1193182 / value;
spin_lock_irqsave(&beep_lock, flags);
if (count) {
/* enable counter 2 */
outb(inb(beep_iobase + 0x61) | 3, beep_iobase + 0x61);
/* set command for counter 2, 2 byte write */
outb(0xB6, beep_iobase + 0x43);
/* select desired HZ */
outb(count & 0xff, beep_iobase + 0x42);
outb((count >> 8) & 0xff, beep_iobase + 0x42);
} else {
/* disable counter 2 */
outb(inb_p(beep_iobase + 0x61) & 0xFC, beep_iobase + 0x61);
}
spin_unlock_irqrestore(&beep_lock, flags);
return 0;
}
static int __init init_isa_beep(struct isa_device *isa_dev)
{
beep_iobase = isa_dev->resource.start;
init_sparcspkr_struct();
sparcspkr_dev.name = sparcspkr_isa_name;
sparcspkr_dev.event = isa_spkr_event;
sparcspkr_dev.id.bustype = BUS_ISA;
input_register_device(&sparcspkr_dev);
printk(KERN_INFO "input: %s\n", sparcspkr_isa_name);
return 0;
}
#endif
static int __init sparcspkr_init(void)
{
struct linux_ebus *ebus;
struct linux_ebus_device *edev = NULL;
#ifdef CONFIG_SPARC64
struct isa_bridge *isa_br;
struct isa_device *isa_dev;
#endif
for_each_ebus(ebus) {
for_each_ebusdev(edev, ebus) {
if (!strcmp(edev->prom_name, "beep"))
return init_ebus_beep(edev);
}
}
#ifdef CONFIG_SPARC64
for_each_isa(isa_br) {
for_each_isadev(isa_dev, isa_br) {
/* A hack, the beep device's base lives in
* the DMA isa node.
*/
if (!strcmp(isa_dev->prom_name, "dma"))
return init_isa_beep(isa_dev);
}
}
#endif
return -ENODEV;
}
static void __exit sparcspkr_exit(void)
{
input_unregister_device(&sparcspkr_dev);
}
module_init(sparcspkr_init);
module_exit(sparcspkr_exit);
#ifndef _I8042_SPARCIO_H
#define _I8042_SPARCIO_H
#include <asm/oplib.h>
#include <asm/ebus.h>
static int i8042_kbd_irq = -1;
static int i8042_aux_irq = -1;
#define I8042_KBD_IRQ i8042_kbd_irq
#define I8042_AUX_IRQ i8042_aux_irq
#define I8042_KBD_PHYS_DESC "sparcps2/serio0"
#define I8042_AUX_PHYS_DESC "sparcps2/serio1"
static unsigned long kbd_iobase;
#define I8042_COMMAND_REG (kbd_iobase + 0x64UL)
#define I8042_DATA_REG (kbd_iobase + 0x60UL)
static inline int i8042_read_data(void)
{
return readb(kbd_iobase + 0x60UL);
}
static inline int i8042_read_status(void)
{
return readb(kbd_iobase + 0x64UL);
}
static inline void i8042_write_data(int val)
{
writeb(val, kbd_iobase + 0x60UL);
}
static inline void i8042_write_command(int val)
{
writeb(val, kbd_iobase + 0x64UL);
}
#define OBP_PS2KBD_NAME1 "kb_ps2"
#define OBP_PS2KBD_NAME2 "keyboard"
#define OBP_PS2MS_NAME1 "kdmouse"
#define OBP_PS2MS_NAME2 "mouse"
static int i8042_platform_init(void)
{
char prop[128];
int len;
len = prom_getproperty(prom_root_node, "name", prop, sizeof(prop));
if (len < 0) {
printk("i8042: Cannot get name property of root OBP node.\n");
return 0;
}
if (strncmp(prop, "SUNW,JavaStation-1", len) == 0) {
/* Hardcoded values for MrCoffee. */
i8042_kbd_irq = i8042_aux_irq = 13 | 0x20;
kbd_iobase = (unsigned long) ioremap(0x71300060, 8);
if (!kbd_iobase)
return 0;
} else {
struct linux_ebus *ebus;
struct linux_ebus_device *edev;
struct linux_ebus_child *child;
for_each_ebus(ebus) {
for_each_ebusdev(edev, ebus) {
if (!strcmp(edev->prom_name, "8042"))
goto edev_found;
}
}
return 0;
edev_found:
for_each_edevchild(edev, child) {
if (!strcmp(child->prom_name, OBP_PS2KBD_NAME1) ||
!strcmp(child->prom_name, OBP_PS2KBD_NAME2)) {
i8042_kbd_irq = child->irqs[0];
kbd_iobase = (unsigned long)
ioremap(child->resource[0].start, 8);
}
if (!strcmp(child->prom_name, OBP_PS2MS_NAME1) ||
!strcmp(child->prom_name, OBP_PS2MS_NAME2))
i8042_aux_irq = child->irqs[0];
}
if (i8042_kbd_irq == -1 ||
i8042_aux_irq == -1) {
printk("i8042: Error, 8042 device lacks both kbd and "
"mouse nodes.\n");
return 0;
}
}
return 1;
}
static inline void i8042_platform_exit(void)
{
iounmap((void *)kbd_iobase);
}
#endif /* _I8042_SPARCIO_H */
...@@ -299,7 +299,7 @@ static void i8042_close(struct serio *port) ...@@ -299,7 +299,7 @@ static void i8042_close(struct serio *port)
*/ */
static struct i8042_values i8042_kbd_values = { static struct i8042_values i8042_kbd_values = {
.irq = I8042_KBD_IRQ, .irq = 0,
.irqen = I8042_CTR_KBDINT, .irqen = I8042_CTR_KBDINT,
.disable = I8042_CTR_KBDDIS, .disable = I8042_CTR_KBDDIS,
.name = "KBD", .name = "KBD",
...@@ -318,7 +318,7 @@ static struct serio i8042_kbd_port = ...@@ -318,7 +318,7 @@ static struct serio i8042_kbd_port =
}; };
static struct i8042_values i8042_aux_values = { static struct i8042_values i8042_aux_values = {
.irq = I8042_AUX_IRQ, .irq = 0,
.irqen = I8042_CTR_AUXINT, .irqen = I8042_CTR_AUXINT,
.disable = I8042_CTR_AUXDIS, .disable = I8042_CTR_AUXDIS,
.name = "AUX", .name = "AUX",
...@@ -638,8 +638,11 @@ static int __init i8042_port_register(struct i8042_values *values, struct serio ...@@ -638,8 +638,11 @@ static int __init i8042_port_register(struct i8042_values *values, struct serio
serio_register_port(port); serio_register_port(port);
printk(KERN_INFO "serio: i8042 %s port at %#x,%#x irq %d\n", printk(KERN_INFO "serio: i8042 %s port at %#lx,%#lx irq %d\n",
values->name, I8042_DATA_REG, I8042_COMMAND_REG, values->irq); values->name,
(unsigned long) I8042_DATA_REG,
(unsigned long) I8042_COMMAND_REG,
values->irq);
return 0; return 0;
} }
...@@ -717,6 +720,9 @@ int __init i8042_init(void) ...@@ -717,6 +720,9 @@ int __init i8042_init(void)
if (!i8042_platform_init()) if (!i8042_platform_init())
return -EBUSY; return -EBUSY;
i8042_kbd_values.irq = I8042_KBD_IRQ;
i8042_aux_values.irq = I8042_AUX_IRQ;
if (i8042_controller_init()) if (i8042_controller_init())
return -ENODEV; return -ENODEV;
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
#if defined(CONFIG_PPC) #if defined(CONFIG_PPC)
#include "i8042-ppcio.h" #include "i8042-ppcio.h"
#elif defined(CONFIG_SPARC32) || defined(CONFIG_SPARC64)
#include "i8042-sparcio.h"
#else #else
#include "i8042-io.h" #include "i8042-io.h"
#endif #endif
......
...@@ -63,6 +63,7 @@ ...@@ -63,6 +63,7 @@
#include <net/pkt_sched.h> #include <net/pkt_sched.h>
#include <linux/list.h> #include <linux/list.h>
#include <linux/reboot.h> #include <linux/reboot.h>
#include <net/checksum.h>
#include <linux/tqueue.h> #include <linux/tqueue.h>
#include <linux/ethtool.h> #include <linux/ethtool.h>
#include <linux/if_vlan.h> #include <linux/if_vlan.h>
......
...@@ -427,6 +427,11 @@ e1000_probe(struct pci_dev *pdev, ...@@ -427,6 +427,11 @@ e1000_probe(struct pci_dev *pdev,
netdev->features = NETIF_F_SG; netdev->features = NETIF_F_SG;
} }
#ifdef NETIF_F_TSO
if(adapter->hw.mac_type >= e1000_82544)
netdev->features |= NETIF_F_TSO;
#endif
if(pci_using_dac) if(pci_using_dac)
netdev->features |= NETIF_F_HIGHDMA; netdev->features |= NETIF_F_HIGHDMA;
...@@ -1284,9 +1289,62 @@ e1000_watchdog(unsigned long data) ...@@ -1284,9 +1289,62 @@ e1000_watchdog(unsigned long data)
#define E1000_TX_FLAGS_CSUM 0x00000001 #define E1000_TX_FLAGS_CSUM 0x00000001
#define E1000_TX_FLAGS_VLAN 0x00000002 #define E1000_TX_FLAGS_VLAN 0x00000002
#define E1000_TX_FLAGS_TSO 0x00000004
#define E1000_TX_FLAGS_VLAN_MASK 0xffff0000 #define E1000_TX_FLAGS_VLAN_MASK 0xffff0000
#define E1000_TX_FLAGS_VLAN_SHIFT 16 #define E1000_TX_FLAGS_VLAN_SHIFT 16
static inline boolean_t
e1000_tso(struct e1000_adapter *adapter, struct sk_buff *skb, int tx_flags)
{
#ifdef NETIF_F_TSO
struct e1000_context_desc *context_desc;
int i;
uint8_t ipcss, ipcso, tucss, tucso, hdr_len;
uint16_t ipcse, tucse, mss;
if(skb_shinfo(skb)->tso_size) {
hdr_len = ((skb->h.raw - skb->data) + (skb->h.th->doff << 2));
mss = skb_shinfo(skb)->tso_size;
skb->nh.iph->tot_len = 0;
skb->nh.iph->check = 0;
skb->h.th->check = ~csum_tcpudp_magic(skb->nh.iph->saddr,
skb->nh.iph->daddr,
0,
IPPROTO_TCP,
0);
ipcss = skb->nh.raw - skb->data;
ipcso = (void *)&(skb->nh.iph->check) - (void *)skb->data;
ipcse = skb->h.raw - skb->data - 1;
tucss = skb->h.raw - skb->data;
tucso = (void *)&(skb->h.th->check) - (void *)skb->data;
tucse = 0;
i = adapter->tx_ring.next_to_use;
context_desc = E1000_CONTEXT_DESC(adapter->tx_ring, i);
context_desc->lower_setup.ip_fields.ipcss = ipcss;
context_desc->lower_setup.ip_fields.ipcso = ipcso;
context_desc->lower_setup.ip_fields.ipcse = cpu_to_le16(ipcse);
context_desc->upper_setup.tcp_fields.tucss = tucss;
context_desc->upper_setup.tcp_fields.tucso = tucso;
context_desc->upper_setup.tcp_fields.tucse = cpu_to_le16(tucse);
context_desc->tcp_seg_setup.fields.mss = cpu_to_le16(mss);
context_desc->tcp_seg_setup.fields.hdr_len = hdr_len;
context_desc->cmd_and_length = cpu_to_le32(adapter->txd_cmd |
E1000_TXD_CMD_DEXT | E1000_TXD_CMD_TSE |
E1000_TXD_CMD_IP | E1000_TXD_CMD_TCP |
(skb->len - (hdr_len)));
i = (i + 1) % adapter->tx_ring.count;
adapter->tx_ring.next_to_use = i;
return TRUE;
}
#endif
return FALSE;
}
static inline boolean_t static inline boolean_t
e1000_tx_csum(struct e1000_adapter *adapter, struct sk_buff *skb) e1000_tx_csum(struct e1000_adapter *adapter, struct sk_buff *skb)
{ {
...@@ -1386,6 +1444,12 @@ e1000_tx_queue(struct e1000_adapter *adapter, int count, int tx_flags) ...@@ -1386,6 +1444,12 @@ e1000_tx_queue(struct e1000_adapter *adapter, int count, int tx_flags)
txd_upper = 0; txd_upper = 0;
txd_lower = adapter->txd_cmd; txd_lower = adapter->txd_cmd;
if(tx_flags & E1000_TX_FLAGS_TSO) {
txd_lower |= E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D |
E1000_TXD_CMD_TSE;
txd_upper |= (E1000_TXD_POPTS_IXSM | E1000_TXD_POPTS_TXSM) << 8;
}
if(tx_flags & E1000_TX_FLAGS_CSUM) { if(tx_flags & E1000_TX_FLAGS_CSUM) {
txd_lower |= E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D; txd_lower |= E1000_TXD_CMD_DEXT | E1000_TXD_DTYP_D;
txd_upper |= E1000_TXD_POPTS_TXSM << 8; txd_upper |= E1000_TXD_POPTS_TXSM << 8;
...@@ -1435,22 +1499,29 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev) ...@@ -1435,22 +1499,29 @@ e1000_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
for(f = 0; f < skb_shinfo(skb)->nr_frags; f++) for(f = 0; f < skb_shinfo(skb)->nr_frags; f++)
count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size, count += TXD_USE_COUNT(skb_shinfo(skb)->frags[f].size,
adapter->max_data_per_txd); adapter->max_data_per_txd);
#ifdef NETIF_F_TSO
if((skb_shinfo(skb)->tso_size) || (skb->ip_summed == CHECKSUM_HW))
count++;
#else
if(skb->ip_summed == CHECKSUM_HW) if(skb->ip_summed == CHECKSUM_HW)
count++; count++;
#endif
if(E1000_DESC_UNUSED(&adapter->tx_ring) < count) { if(E1000_DESC_UNUSED(&adapter->tx_ring) < count) {
netif_stop_queue(netdev); netif_stop_queue(netdev);
return 1; return 1;
} }
if(e1000_tx_csum(adapter, skb))
tx_flags |= E1000_TX_FLAGS_CSUM;
if(adapter->vlgrp && vlan_tx_tag_present(skb)) { if(adapter->vlgrp && vlan_tx_tag_present(skb)) {
tx_flags |= E1000_TX_FLAGS_VLAN; tx_flags |= E1000_TX_FLAGS_VLAN;
tx_flags |= (vlan_tx_tag_get(skb) << E1000_TX_FLAGS_VLAN_SHIFT); tx_flags |= (vlan_tx_tag_get(skb) << E1000_TX_FLAGS_VLAN_SHIFT);
} }
if(e1000_tso(adapter, skb, tx_flags))
tx_flags |= E1000_TX_FLAGS_TSO;
else if(e1000_tx_csum(adapter, skb))
tx_flags |= E1000_TX_FLAGS_CSUM;
count = e1000_tx_map(adapter, skb); count = e1000_tx_map(adapter, skb);
e1000_tx_queue(adapter, count, tx_flags); e1000_tx_queue(adapter, count, tx_flags);
......
...@@ -622,9 +622,12 @@ e1000_proc_list_setup(struct e1000_adapter *adapter) ...@@ -622,9 +622,12 @@ e1000_proc_list_setup(struct e1000_adapter *adapter)
LIST_ADD_U("Rx_Long_Length_Errors", &adapter->stats.roc); LIST_ADD_U("Rx_Long_Length_Errors", &adapter->stats.roc);
LIST_ADD_U("Rx_Short_Length_Errors", &adapter->stats.ruc); LIST_ADD_U("Rx_Short_Length_Errors", &adapter->stats.ruc);
/* The 82542 does not have an alignment error count register */ /* The 82542 does not have some of these stats */
if(adapter->hw.mac_type >= e1000_82543) if(adapter->hw.mac_type >= e1000_82543) {
LIST_ADD_U("Rx_Align_Errors", &adapter->stats.algnerrc); LIST_ADD_U("Rx_Align_Errors", &adapter->stats.algnerrc);
LIST_ADD_U("Tx_TCP_Seg_Good", &adapter->stats.tsctc);
LIST_ADD_U("Tx_TCP_Seg_Failed", &adapter->stats.tsctfc);
}
LIST_ADD_U("Rx_Flow_Control_XON", &adapter->stats.xonrxc); LIST_ADD_U("Rx_Flow_Control_XON", &adapter->stats.xonrxc);
LIST_ADD_U("Rx_Flow_Control_XOFF", &adapter->stats.xoffrxc); LIST_ADD_U("Rx_Flow_Control_XOFF", &adapter->stats.xoffrxc);
......
...@@ -49,11 +49,72 @@ ...@@ -49,11 +49,72 @@
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include <linux/skbuff.h> #include <linux/skbuff.h>
#include <net/sock.h> #include <net/sock.h>
#include <net/checksum.h>
#include <linux/if_ether.h> /* For the statistics structure. */ #include <linux/if_ether.h> /* For the statistics structure. */
#include <linux/if_arp.h> /* For ARPHRD_ETHER */ #include <linux/if_arp.h> /* For ARPHRD_ETHER */
#include <linux/ip.h>
#include <linux/tcp.h>
#define LOOPBACK_OVERHEAD (128 + MAX_HEADER + 16 + 16) #define LOOPBACK_OVERHEAD (128 + MAX_HEADER + 16 + 16)
/* KISS: just allocate small chunks and copy bits.
*
* So, in fact, this is documentation, explaining what we expect
* of largesending device modulo TCP checksum, which is ignored for loopback.
*/
static void emulate_large_send_offload(struct sk_buff *skb)
{
struct iphdr *iph = skb->nh.iph;
struct tcphdr *th = (struct tcphdr*)(skb->nh.raw + (iph->ihl * 4));
unsigned int doffset = (iph->ihl + th->doff) * 4;
unsigned int mtu = skb_shinfo(skb)->tso_size + doffset;
unsigned int offset = 0;
u32 seq = ntohl(th->seq);
u16 id = ntohs(iph->id);
while (offset + doffset < skb->len) {
unsigned int frag_size = min(mtu, skb->len - offset) - doffset;
struct sk_buff *nskb = alloc_skb(mtu + 32, GFP_ATOMIC);
if (!nskb)
break;
skb_reserve(nskb, 32);
nskb->mac.raw = nskb->data - 14;
nskb->nh.raw = nskb->data;
iph = nskb->nh.iph;
memcpy(nskb->data, skb->nh.raw, doffset);
if (skb_copy_bits(skb,
doffset + offset,
nskb->data + doffset,
frag_size))
BUG();
skb_put(nskb, doffset + frag_size);
nskb->ip_summed = CHECKSUM_UNNECESSARY;
nskb->dev = skb->dev;
nskb->priority = skb->priority;
nskb->protocol = skb->protocol;
nskb->dst = dst_clone(skb->dst);
memcpy(nskb->cb, skb->cb, sizeof(skb->cb));
nskb->pkt_type = skb->pkt_type;
th = (struct tcphdr*)(nskb->nh.raw + iph->ihl*4);
iph->tot_len = htons(frag_size + doffset);
iph->id = htons(id);
iph->check = 0;
iph->check = ip_fast_csum((unsigned char *) iph, iph->ihl);
th->seq = htonl(seq);
if (offset + doffset + frag_size < skb->len)
th->fin = th->psh = 0;
netif_rx(nskb);
offset += frag_size;
seq += frag_size;
id++;
}
dev_kfree_skb(skb);
}
/* /*
* The higher levels take care of making this non-reentrant (it's * The higher levels take care of making this non-reentrant (it's
* called with bh's disabled). * called with bh's disabled).
...@@ -86,6 +147,18 @@ static int loopback_xmit(struct sk_buff *skb, struct net_device *dev) ...@@ -86,6 +147,18 @@ static int loopback_xmit(struct sk_buff *skb, struct net_device *dev)
skb->ip_summed = CHECKSUM_UNNECESSARY; skb->ip_summed = CHECKSUM_UNNECESSARY;
#endif #endif
if (skb_shinfo(skb)->tso_size) {
struct iphdr *iph = skb->nh.iph;
if (skb->protocol != htons(ETH_P_IP))
BUG();
if (iph->protocol != IPPROTO_TCP)
BUG();
emulate_large_send_offload(skb);
return 0;
}
dev->last_rx = jiffies; dev->last_rx = jiffies;
stats->rx_bytes+=skb->len; stats->rx_bytes+=skb->len;
stats->tx_bytes+=skb->len; stats->tx_bytes+=skb->len;
...@@ -117,6 +190,12 @@ int __init loopback_init(struct net_device *dev) ...@@ -117,6 +190,12 @@ int __init loopback_init(struct net_device *dev)
dev->rebuild_header = eth_rebuild_header; dev->rebuild_header = eth_rebuild_header;
dev->flags = IFF_LOOPBACK; dev->flags = IFF_LOOPBACK;
dev->features = NETIF_F_SG|NETIF_F_FRAGLIST|NETIF_F_NO_CSUM|NETIF_F_HIGHDMA; dev->features = NETIF_F_SG|NETIF_F_FRAGLIST|NETIF_F_NO_CSUM|NETIF_F_HIGHDMA;
/* Current netfilter will die with oom linearizing large skbs,
* however this will be cured before 2.5.x is done.
*/
dev->features |= NETIF_F_TSO;
dev->priv = kmalloc(sizeof(struct net_device_stats), GFP_KERNEL); dev->priv = kmalloc(sizeof(struct net_device_stats), GFP_KERNEL);
if (dev->priv == NULL) if (dev->priv == NULL)
return -ENOMEM; return -ENOMEM;
......
...@@ -68,7 +68,7 @@ static int options_node = 0; ...@@ -68,7 +68,7 @@ static int options_node = 0;
*/ */
static int copyin(struct openpromio *info, struct openpromio **opp_p) static int copyin(struct openpromio *info, struct openpromio **opp_p)
{ {
int bufsize; unsigned int bufsize;
if (!info || !opp_p) if (!info || !opp_p)
return -EFAULT; return -EFAULT;
......
...@@ -54,6 +54,7 @@ static int sg_version_num = 30527; /* 2 digits for each component */ ...@@ -54,6 +54,7 @@ static int sg_version_num = 30527; /* 2 digits for each component */
#include <linux/fcntl.h> #include <linux/fcntl.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/poll.h> #include <linux/poll.h>
#include <linux/vmalloc.h>
#include <linux/smp_lock.h> #include <linux/smp_lock.h>
#include <asm/io.h> #include <asm/io.h>
......
...@@ -51,7 +51,7 @@ if [ "$CONFIG_ARM" = "y" ]; then ...@@ -51,7 +51,7 @@ if [ "$CONFIG_ARM" = "y" ]; then
dep_bool ' Console on SA1100 serial port' CONFIG_SERIAL_SA1100_CONSOLE $CONFIG_SERIAL_SA1100 dep_bool ' Console on SA1100 serial port' CONFIG_SERIAL_SA1100_CONSOLE $CONFIG_SERIAL_SA1100
fi fi
if [ "$CONFIG_SPARC" = "y" -o "$CONFIG_SPARC64" = "y" ]; then if [ "$CONFIG_SPARC32" = "y" -o "$CONFIG_SPARC64" = "y" ]; then
define_bool CONFIG_SERIAL_SUNCORE y define_bool CONFIG_SERIAL_SUNCORE y
define_bool CONFIG_SERIAL_CORE_CONSOLE y define_bool CONFIG_SERIAL_CORE_CONSOLE y
tristate 'Sun Zilog8530 serial support' CONFIG_SERIAL_SUNZILOG tristate 'Sun Zilog8530 serial support' CONFIG_SERIAL_SUNZILOG
......
...@@ -362,7 +362,7 @@ static char idstring[60] __initdata = { 0 }; ...@@ -362,7 +362,7 @@ static char idstring[60] __initdata = { 0 };
char __init *cgfourteenfb_init(struct fb_info_sbusfb *fb) char __init *cgfourteenfb_init(struct fb_info_sbusfb *fb)
{ {
struct fb_fix_screeninfo *fix = &fb->fix; struct fb_fix_screeninfo *fix = &fb->info.fix;
struct display *disp = &fb->disp; struct display *disp = &fb->disp;
struct fbtype *type = &fb->type; struct fbtype *type = &fb->type;
unsigned long rphys, phys; unsigned long rphys, phys;
...@@ -414,7 +414,7 @@ char __init *cgfourteenfb_init(struct fb_info_sbusfb *fb) ...@@ -414,7 +414,7 @@ char __init *cgfourteenfb_init(struct fb_info_sbusfb *fb)
strcpy(fb->info.modename, "CGfourteen"); strcpy(fb->info.modename, "CGfourteen");
strcpy(fix->id, "CGfourteen"); strcpy(fix->id, "CGfourteen");
fix->line_length = fb->var.xres_virtual; fix->line_length = fb->info.var.xres_virtual;
fix->accel = FB_ACCEL_SUN_CG14; fix->accel = FB_ACCEL_SUN_CG14;
disp->scrollmode = SCROLL_YREDRAW; disp->scrollmode = SCROLL_YREDRAW;
......
...@@ -224,14 +224,14 @@ static struct sbus_mmap_map cg6_mmap_map[] = { ...@@ -224,14 +224,14 @@ static struct sbus_mmap_map cg6_mmap_map[] = {
static void cg6_setup(struct display *p) static void cg6_setup(struct display *p)
{ {
p->next_line = sbusfbinfo(p->fb_info)->var.xres_virtual; p->next_line = p->fb_info->var.xres_virtual;
p->next_plane = 0; p->next_plane = 0;
} }
static void cg6_clear(struct vc_data *conp, struct display *p, int sy, int sx, static void cg6_clear(struct vc_data *conp, struct display *p, int sy, int sx,
int height, int width) int height, int width)
{ {
struct fb_info_sbusfb *fb = (struct fb_info_sbusfb *)p->fb_info; struct fb_info_sbusfb *fb = sbusfbinfo(p->fb_info);
register struct cg6_fbc *fbc = fb->s.cg6.fbc; register struct cg6_fbc *fbc = fb->s.cg6.fbc;
unsigned long flags; unsigned long flags;
int x, y, w, h; int x, y, w, h;
...@@ -302,7 +302,7 @@ static void cg6_fill(struct fb_info_sbusfb *fb, struct display *p, int s, ...@@ -302,7 +302,7 @@ static void cg6_fill(struct fb_info_sbusfb *fb, struct display *p, int s,
static void cg6_putc(struct vc_data *conp, struct display *p, int c, int yy, int xx) static void cg6_putc(struct vc_data *conp, struct display *p, int c, int yy, int xx)
{ {
struct fb_info_sbusfb *fb = (struct fb_info_sbusfb *)p->fb_info; struct fb_info_sbusfb *fb = sbusfbinfo(p->fb_info);
register struct cg6_fbc *fbc = fb->s.cg6.fbc; register struct cg6_fbc *fbc = fb->s.cg6.fbc;
unsigned long flags; unsigned long flags;
int i, x, y; int i, x, y;
...@@ -359,7 +359,7 @@ static void cg6_putc(struct vc_data *conp, struct display *p, int c, int yy, int ...@@ -359,7 +359,7 @@ static void cg6_putc(struct vc_data *conp, struct display *p, int c, int yy, int
static void cg6_putcs(struct vc_data *conp, struct display *p, const unsigned short *s, static void cg6_putcs(struct vc_data *conp, struct display *p, const unsigned short *s,
int count, int yy, int xx) int count, int yy, int xx)
{ {
struct fb_info_sbusfb *fb = (struct fb_info_sbusfb *)p->fb_info; struct fb_info_sbusfb *fb = sbusfbinfo(p->fb_info);
register struct cg6_fbc *fbc = fb->s.cg6.fbc; register struct cg6_fbc *fbc = fb->s.cg6.fbc;
unsigned long flags; unsigned long flags;
int i, x, y; int i, x, y;
...@@ -692,8 +692,8 @@ static char idstring[70] __initdata = { 0 }; ...@@ -692,8 +692,8 @@ static char idstring[70] __initdata = { 0 };
char __init *cgsixfb_init(struct fb_info_sbusfb *fb) char __init *cgsixfb_init(struct fb_info_sbusfb *fb)
{ {
struct fb_fix_screeninfo *fix = &fb->fix; struct fb_fix_screeninfo *fix = &fb->info.fix;
struct fb_var_screeninfo *var = &fb->var; struct fb_var_screeninfo *var = &fb->info.var;
struct display *disp = &fb->disp; struct display *disp = &fb->disp;
struct fbtype *type = &fb->type; struct fbtype *type = &fb->type;
struct sbus_dev *sdev = fb->sbdp; struct sbus_dev *sdev = fb->sbdp;
...@@ -717,7 +717,7 @@ char __init *cgsixfb_init(struct fb_info_sbusfb *fb) ...@@ -717,7 +717,7 @@ char __init *cgsixfb_init(struct fb_info_sbusfb *fb)
fix->smem_len *= 4; fix->smem_len *= 4;
} }
fix->line_length = fb->var.xres_virtual; fix->line_length = fb->info.var.xres_virtual;
fix->accel = FB_ACCEL_SUN_CGSIX; fix->accel = FB_ACCEL_SUN_CGSIX;
var->accel_flags = FB_ACCELF_TEXT; var->accel_flags = FB_ACCELF_TEXT;
......
...@@ -176,7 +176,7 @@ static char idstring[60] __initdata = { 0 }; ...@@ -176,7 +176,7 @@ static char idstring[60] __initdata = { 0 };
char __init *cgthreefb_init(struct fb_info_sbusfb *fb) char __init *cgthreefb_init(struct fb_info_sbusfb *fb)
{ {
struct fb_fix_screeninfo *fix = &fb->fix; struct fb_fix_screeninfo *fix = &fb->info.fix;
struct display *disp = &fb->disp; struct display *disp = &fb->disp;
struct fbtype *type = &fb->type; struct fbtype *type = &fb->type;
struct sbus_dev *sdev = fb->sbdp; struct sbus_dev *sdev = fb->sbdp;
...@@ -216,7 +216,7 @@ char __init *cgthreefb_init(struct fb_info_sbusfb *fb) ...@@ -216,7 +216,7 @@ char __init *cgthreefb_init(struct fb_info_sbusfb *fb)
strcpy(fb->info.modename, "CGthree"); strcpy(fb->info.modename, "CGthree");
strcpy(fix->id, "CGthree"); strcpy(fix->id, "CGthree");
fix->line_length = fb->var.xres_virtual; fix->line_length = fb->info.var.xres_virtual;
fix->accel = FB_ACCEL_SUN_CGTHREE; fix->accel = FB_ACCEL_SUN_CGTHREE;
disp->scrollmode = SCROLL_YREDRAW; disp->scrollmode = SCROLL_YREDRAW;
......
...@@ -360,7 +360,7 @@ static void ffb_setup(struct display *p) ...@@ -360,7 +360,7 @@ static void ffb_setup(struct display *p)
static void ffb_clear(struct vc_data *conp, struct display *p, int sy, int sx, static void ffb_clear(struct vc_data *conp, struct display *p, int sy, int sx,
int height, int width) int height, int width)
{ {
struct fb_info_sbusfb *fb = (struct fb_info_sbusfb *)p->fb_info; struct fb_info_sbusfb *fb = sbusfbinfo(p->fb_info);
register struct ffb_fbc *fbc = fb->s.ffb.fbc; register struct ffb_fbc *fbc = fb->s.ffb.fbc;
unsigned long flags; unsigned long flags;
u64 yx, hw; u64 yx, hw;
...@@ -417,7 +417,7 @@ static void ffb_fill(struct fb_info_sbusfb *fb, struct display *p, int s, ...@@ -417,7 +417,7 @@ static void ffb_fill(struct fb_info_sbusfb *fb, struct display *p, int s,
static void ffb_putc(struct vc_data *conp, struct display *p, int c, int yy, int xx) static void ffb_putc(struct vc_data *conp, struct display *p, int c, int yy, int xx)
{ {
struct fb_info_sbusfb *fb = (struct fb_info_sbusfb *)p->fb_info; struct fb_info_sbusfb *fb = sbusfbinfo(p->fb_info);
register struct ffb_fbc *fbc = fb->s.ffb.fbc; register struct ffb_fbc *fbc = fb->s.ffb.fbc;
unsigned long flags; unsigned long flags;
int i, xy; int i, xy;
...@@ -470,7 +470,7 @@ static void ffb_putc(struct vc_data *conp, struct display *p, int c, int yy, int ...@@ -470,7 +470,7 @@ static void ffb_putc(struct vc_data *conp, struct display *p, int c, int yy, int
static void ffb_putcs(struct vc_data *conp, struct display *p, const unsigned short *s, static void ffb_putcs(struct vc_data *conp, struct display *p, const unsigned short *s,
int count, int yy, int xx) int count, int yy, int xx)
{ {
struct fb_info_sbusfb *fb = (struct fb_info_sbusfb *)p->fb_info; struct fb_info_sbusfb *fb = sbusfbinfo(p->fb_info);
register struct ffb_fbc *fbc = fb->s.ffb.fbc; register struct ffb_fbc *fbc = fb->s.ffb.fbc;
unsigned long flags; unsigned long flags;
int i, xy; int i, xy;
...@@ -805,8 +805,8 @@ static int __init creator_apply_upa_parent_ranges(int parent, struct linux_prom6 ...@@ -805,8 +805,8 @@ static int __init creator_apply_upa_parent_ranges(int parent, struct linux_prom6
char __init *creatorfb_init(struct fb_info_sbusfb *fb) char __init *creatorfb_init(struct fb_info_sbusfb *fb)
{ {
struct fb_fix_screeninfo *fix = &fb->fix; struct fb_fix_screeninfo *fix = &fb->info.fix;
struct fb_var_screeninfo *var = &fb->var; struct fb_var_screeninfo *var = &fb->info.var;
struct display *disp = &fb->disp; struct display *disp = &fb->disp;
struct fbtype *type = &fb->type; struct fbtype *type = &fb->type;
struct linux_prom64_registers regs[2*PROMREG_MAX]; struct linux_prom64_registers regs[2*PROMREG_MAX];
...@@ -861,7 +861,7 @@ char __init *creatorfb_init(struct fb_info_sbusfb *fb) ...@@ -861,7 +861,7 @@ char __init *creatorfb_init(struct fb_info_sbusfb *fb)
var->accel_flags = FB_ACCELF_TEXT; var->accel_flags = FB_ACCELF_TEXT;
disp->scrollmode = SCROLL_YREDRAW; disp->scrollmode = SCROLL_YREDRAW;
fb->info.screen_base = (char *)__va(regs[0].phys_addr) + FFB_DFB24_POFF + 8192 * fb->y_margin + 4 * fb->x_margin; fb->info.screen_base = (char *)(regs[0].phys_addr) + FFB_DFB24_POFF + 8192 * fb->y_margin + 4 * fb->x_margin;
fb->s.ffb.xy_margin = (fb->y_margin << 16) + fb->x_margin; fb->s.ffb.xy_margin = (fb->y_margin << 16) + fb->x_margin;
fb->s.ffb.yx_margin = (((u64)fb->y_margin) << 32) + fb->x_margin; fb->s.ffb.yx_margin = (((u64)fb->y_margin) << 32) + fb->x_margin;
fb->s.ffb.fbc = (struct ffb_fbc *)(regs[0].phys_addr + FFB_FBC_REGS_POFF); fb->s.ffb.fbc = (struct ffb_fbc *)(regs[0].phys_addr + FFB_FBC_REGS_POFF);
......
...@@ -242,48 +242,49 @@ static void sbusfb_clear_margin(struct display *p, int s) ...@@ -242,48 +242,49 @@ static void sbusfb_clear_margin(struct display *p, int s)
rects [0] = 0; rects [0] = 0;
rects [1] = 0; rects [1] = 0;
rects [2] = fb->var.xres_virtual; rects [2] = fb->info.var.xres_virtual;
rects [3] = fb->y_margin; rects [3] = fb->y_margin;
rects [4] = 0; rects [4] = 0;
rects [5] = fb->y_margin; rects [5] = fb->y_margin;
rects [6] = fb->x_margin; rects [6] = fb->x_margin;
rects [7] = fb->var.yres_virtual; rects [7] = fb->info.var.yres_virtual;
rects [8] = fb->var.xres_virtual - fb->x_margin; rects [8] = fb->info.var.xres_virtual - fb->x_margin;
rects [9] = fb->y_margin; rects [9] = fb->y_margin;
rects [10] = fb->var.xres_virtual; rects [10] = fb->info.var.xres_virtual;
rects [11] = fb->var.yres_virtual; rects [11] = fb->info.var.yres_virtual;
rects [12] = fb->x_margin; rects [12] = fb->x_margin;
rects [13] = fb->var.yres_virtual - fb->y_margin; rects [13] = fb->info.var.yres_virtual - fb->y_margin;
rects [14] = fb->var.xres_virtual - fb->x_margin; rects [14] = fb->info.var.xres_virtual - fb->x_margin;
rects [15] = fb->var.yres_virtual; rects [15] = fb->info.var.yres_virtual;
(*fb->fill)(fb, p, s, 4, rects); (*fb->fill)(fb, p, s, 4, rects);
} else { } else {
unsigned char *fb_base = fb->info.screen_base, *q; unsigned char *fb_base = fb->info.screen_base, *q;
int skip_bytes = fb->y_margin * fb->var.xres_virtual; int skip_bytes = fb->y_margin * fb->info.var.xres_virtual;
int scr_size = fb->var.xres_virtual * fb->var.yres_virtual; int scr_size = fb->info.var.xres_virtual
* fb->info.var.yres_virtual;
int h, he, incr, size; int h, he, incr, size;
he = fb->var.yres; he = fb->info.var.yres;
if (fb->var.bits_per_pixel == 1) { if (fb->info.var.bits_per_pixel == 1) {
fb_base -= (skip_bytes + fb->x_margin) / 8; fb_base -= (skip_bytes + fb->x_margin) / 8;
skip_bytes /= 8; skip_bytes /= 8;
scr_size /= 8; scr_size /= 8;
fb_memset255 (fb_base, skip_bytes - fb->x_margin / 8); fb_memset255 (fb_base, skip_bytes - fb->x_margin / 8);
fb_memset255 (fb_base + scr_size - skip_bytes + fb->x_margin / 8, skip_bytes - fb->x_margin / 8); fb_memset255 (fb_base + scr_size - skip_bytes + fb->x_margin / 8, skip_bytes - fb->x_margin / 8);
incr = fb->var.xres_virtual / 8; incr = fb->info.var.xres_virtual / 8;
size = fb->x_margin / 8 * 2; size = fb->x_margin / 8 * 2;
for (q = fb_base + skip_bytes - fb->x_margin / 8, h = 0; for (q = fb_base + skip_bytes - fb->x_margin / 8, h = 0;
h <= he; q += incr, h++) h <= he; q += incr, h++)
fb_memset255 (q, size); fb_memset255 (q, size);
} else { } else {
fb_base -= (skip_bytes + fb->x_margin); fb_base -= (skip_bytes + fb->x_margin);
memset (fb_base, attr_bgcol(p,s), skip_bytes - fb->x_margin); fb_memset (fb_base, attr_bgcol(p,s), skip_bytes - fb->x_margin);
memset (fb_base + scr_size - skip_bytes + fb->x_margin, attr_bgcol(p,s), skip_bytes - fb->x_margin); fb_memset (fb_base + scr_size - skip_bytes + fb->x_margin, attr_bgcol(p,s), skip_bytes - fb->x_margin);
incr = fb->var.xres_virtual; incr = fb->info.var.xres_virtual;
size = fb->x_margin * 2; size = fb->x_margin * 2;
for (q = fb_base + skip_bytes - fb->x_margin, h = 0; for (q = fb_base + skip_bytes - fb->x_margin, h = 0;
h <= he; q += incr, h++) h <= he; q += incr, h++)
memset (q, attr_bgcol(p,s), size); fb_memset (q, attr_bgcol(p,s), size);
} }
} }
} }
...@@ -913,8 +914,8 @@ static void __init sbusfb_init_fb(int node, int parent, int fbtype, ...@@ -913,8 +914,8 @@ static void __init sbusfb_init_fb(int node, int parent, int fbtype,
prom_palette = sbusfb_palette; prom_palette = sbusfb_palette;
memset(fb, 0, sizeof(struct fb_info_sbusfb)); memset(fb, 0, sizeof(struct fb_info_sbusfb));
fix = &fb->fix; fix = &fb->info.fix;
var = &fb->var; var = &fb->info.var;
disp = &fb->disp; disp = &fb->disp;
type = &fb->type; type = &fb->type;
...@@ -929,7 +930,7 @@ static void __init sbusfb_init_fb(int node, int parent, int fbtype, ...@@ -929,7 +930,7 @@ static void __init sbusfb_init_fb(int node, int parent, int fbtype,
memset(&fb->emulations, 0xff, sizeof(fb->emulations)); memset(&fb->emulations, 0xff, sizeof(fb->emulations));
fb->emulations[0] = fbtype; fb->emulations[0] = fbtype;
#ifndef __sparc_v9__ #ifdef CONFIG_SPARC32
fb->info.screen_base = (unsigned char *)prom_getintdefault(node, "address", 0); fb->info.screen_base = (unsigned char *)prom_getintdefault(node, "address", 0);
#endif #endif
......
...@@ -112,7 +112,7 @@ static void padzero(unsigned long elf_bss) ...@@ -112,7 +112,7 @@ static void padzero(unsigned long elf_bss)
#define STACK_ADD(sp, items) ((elf_addr_t *)(sp) + (items)) #define STACK_ADD(sp, items) ((elf_addr_t *)(sp) + (items))
#define STACK_ROUND(sp, items) \ #define STACK_ROUND(sp, items) \
((15 + (unsigned long) ((sp) + (items))) &~ 15UL) ((15 + (unsigned long) ((sp) + (items))) &~ 15UL)
#define STACK_ALLOC(sp, len) ({ elf_addr_t old_sp = sp; sp += len; old_sp; }) #define STACK_ALLOC(sp, len) ({ elf_addr_t *old_sp = sp; sp += len; old_sp; })
#else #else
#define STACK_ADD(sp, items) ((elf_addr_t *)(sp) - (items)) #define STACK_ADD(sp, items) ((elf_addr_t *)(sp) - (items))
#define STACK_ROUND(sp, items) \ #define STACK_ROUND(sp, items) \
...@@ -129,7 +129,7 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr * exec, ...@@ -129,7 +129,7 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr * exec,
int argc = bprm->argc; int argc = bprm->argc;
int envc = bprm->envc; int envc = bprm->envc;
elf_addr_t *argv, *envp; elf_addr_t *argv, *envp;
elf_addr_t *sp, u_platform; elf_addr_t *sp, *u_platform;
const char *k_platform = ELF_PLATFORM; const char *k_platform = ELF_PLATFORM;
int items; int items;
elf_addr_t elf_info[30]; elf_addr_t elf_info[30];
...@@ -142,6 +142,7 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr * exec, ...@@ -142,6 +142,7 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr * exec,
* merely difficult. * merely difficult.
*/ */
u_platform = NULL;
if (k_platform) { if (k_platform) {
size_t len = strlen(k_platform) + 1; size_t len = strlen(k_platform) + 1;
...@@ -160,8 +161,8 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr * exec, ...@@ -160,8 +161,8 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr * exec,
if (smp_num_siblings > 1) if (smp_num_siblings > 1)
STACK_ALLOC(p, ((current->pid % 64) << 7)); STACK_ALLOC(p, ((current->pid % 64) << 7));
#endif #endif
u_platform = STACK_ALLOC(p, len); u_platform = (elf_addr_t *) STACK_ALLOC(p, len);
__copy_to_user((void *)u_platform, k_platform, len); __copy_to_user(u_platform, k_platform, len);
} }
/* Create the ELF interpreter info */ /* Create the ELF interpreter info */
...@@ -189,7 +190,7 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr * exec, ...@@ -189,7 +190,7 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr * exec,
NEW_AUX_ENT(AT_GID, (elf_addr_t) current->gid); NEW_AUX_ENT(AT_GID, (elf_addr_t) current->gid);
NEW_AUX_ENT(AT_EGID, (elf_addr_t) current->egid); NEW_AUX_ENT(AT_EGID, (elf_addr_t) current->egid);
if (k_platform) { if (k_platform) {
NEW_AUX_ENT(AT_PLATFORM, u_platform); NEW_AUX_ENT(AT_PLATFORM, (elf_addr_t)(long)u_platform);
} }
NEW_AUX_ENT(AT_NULL, 0); NEW_AUX_ENT(AT_NULL, 0);
#undef NEW_AUX_ENT #undef NEW_AUX_ENT
...@@ -217,8 +218,8 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr * exec, ...@@ -217,8 +218,8 @@ create_elf_tables(struct linux_binprm *bprm, struct elfhdr * exec,
if (interp_aout) { if (interp_aout) {
argv = sp + 2; argv = sp + 2;
envp = argv + argc + 1; envp = argv + argc + 1;
__put_user((elf_addr_t)argv, sp++); __put_user((elf_addr_t)(long)argv, sp++);
__put_user((elf_addr_t)envp, sp++); __put_user((elf_addr_t)(long)envp, sp++);
} else { } else {
argv = sp; argv = sp;
envp = argv + argc + 1; envp = argv + argc + 1;
......
...@@ -77,7 +77,8 @@ static ssize_t nodenum_read(struct file *file, char *buf, ...@@ -77,7 +77,8 @@ static ssize_t nodenum_read(struct file *file, char *buf,
return 0; return 0;
if (count > 9 - file->f_pos) if (count > 9 - file->f_pos)
count = 9 - file->f_pos; count = 9 - file->f_pos;
copy_to_user(buf, buffer + file->f_pos, count); if (copy_to_user(buf, buffer + file->f_pos, count))
return -EFAULT;
file->f_pos += count; file->f_pos += count;
return count; return count;
} }
...@@ -93,7 +94,7 @@ static ssize_t property_read(struct file *filp, char *buf, ...@@ -93,7 +94,7 @@ static ssize_t property_read(struct file *filp, char *buf,
openprom_property *op; openprom_property *op;
char buffer[64]; char buffer[64];
if (filp->f_pos >= 0xffffff) if (filp->f_pos >= 0xffffff || count >= 0xffffff)
return -EINVAL; return -EINVAL;
if (!filp->private_data) { if (!filp->private_data) {
node = nodes[(u16)((long)inode->u.generic_ip)].node; node = nodes[(u16)((long)inode->u.generic_ip)].node;
...@@ -184,7 +185,8 @@ static ssize_t property_read(struct file *filp, char *buf, ...@@ -184,7 +185,8 @@ static ssize_t property_read(struct file *filp, char *buf,
if (count > i - k) count = i - k; if (count > i - k) count = i - k;
if (op->flag & OPP_STRING) { if (op->flag & OPP_STRING) {
if (!k) { if (!k) {
__put_user('\'', buf); if (put_user('\'', buf))
return -EFAULT;
k++; k++;
count--; count--;
} }
...@@ -195,17 +197,21 @@ static ssize_t property_read(struct file *filp, char *buf, ...@@ -195,17 +197,21 @@ static ssize_t property_read(struct file *filp, char *buf,
j = count; j = count;
if (j >= 0) { if (j >= 0) {
copy_to_user(buf + k - filp->f_pos, if (copy_to_user(buf + k - filp->f_pos,
op->value + k - 1, j); op->value + k - 1, j))
return -EFAULT;
count -= j; count -= j;
k += j; k += j;
} }
if (count) if (count) {
__put_user('\'', &buf [k++ - filp->f_pos]); if (put_user('\'', &buf [k++ - filp->f_pos]))
if (count > 1) return -EFAULT;
__put_user('\n', &buf [k++ - filp->f_pos]); }
if (count > 1) {
if (put_user('\n', &buf [k++ - filp->f_pos]))
return -EFAULT;
}
} else if (op->flag & OPP_STRINGLIST) { } else if (op->flag & OPP_STRINGLIST) {
char *tmp; char *tmp;
...@@ -225,7 +231,8 @@ static ssize_t property_read(struct file *filp, char *buf, ...@@ -225,7 +231,8 @@ static ssize_t property_read(struct file *filp, char *buf,
} }
strcpy(s, "'\n"); strcpy(s, "'\n");
copy_to_user(buf, tmp + k, count); if (copy_to_user(buf, tmp + k, count))
return -EFAULT;
kfree(tmp); kfree(tmp);
k += count; k += count;
...@@ -243,53 +250,68 @@ static ssize_t property_read(struct file *filp, char *buf, ...@@ -243,53 +250,68 @@ static ssize_t property_read(struct file *filp, char *buf,
if (first == last) { if (first == last) {
sprintf (buffer, "%08x.", *first); sprintf (buffer, "%08x.", *first);
copy_to_user (buf, buffer + first_off, last_cnt - first_off); if (copy_to_user(buf, buffer + first_off,
last_cnt - first_off))
return -EFAULT;
buf += last_cnt - first_off; buf += last_cnt - first_off;
} else { } else {
for (q = first; q <= last; q++) { for (q = first; q <= last; q++) {
sprintf (buffer, "%08x.", *q); sprintf (buffer, "%08x.", *q);
if (q == first) { if (q == first) {
copy_to_user (buf, buffer + first_off, if (copy_to_user(buf, buffer + first_off,
9 - first_off); 9 - first_off))
return -EFAULT;
buf += 9 - first_off; buf += 9 - first_off;
} else if (q == last) { } else if (q == last) {
copy_to_user (buf, buffer, last_cnt); if (copy_to_user(buf, buffer, last_cnt))
return -EFAULT;
buf += last_cnt; buf += last_cnt;
} else { } else {
copy_to_user (buf, buffer, 9); if (copy_to_user(buf, buffer, 9))
return -EFAULT;
buf += 9; buf += 9;
} }
} }
} }
if (last == (u32 *)(op->value + op->len - 4) && last_cnt == 9) if (last == (u32 *)(op->value + op->len - 4) && last_cnt == 9) {
__put_user('\n', (buf - 1)); if (put_user('\n', (buf - 1)))
return -EFAULT;
}
k += count; k += count;
} else if (op->flag & OPP_HEXSTRING) { } else if (op->flag & OPP_HEXSTRING) {
char buffer[2]; char buffer[3];
if ((k < i - 1) && (k & 1)) { if ((k < i - 1) && (k & 1)) {
sprintf (buffer, "%02x", *(op->value + (k >> 1))); sprintf (buffer, "%02x",
__put_user(buffer[1], &buf[k++ - filp->f_pos]); (unsigned char) *(op->value + (k >> 1)) & 0xff);
if (put_user(buffer[1], &buf[k++ - filp->f_pos]))
return -EFAULT;
count--; count--;
} }
for (; (count > 1) && (k < i - 1); k += 2) { for (; (count > 1) && (k < i - 1); k += 2) {
sprintf (buffer, "%02x", *(op->value + (k >> 1))); sprintf (buffer, "%02x",
copy_to_user (buf + k - filp->f_pos, buffer, 2); (unsigned char) *(op->value + (k >> 1)) & 0xff);
if (copy_to_user(buf + k - filp->f_pos, buffer, 2))
return -EFAULT;
count -= 2; count -= 2;
} }
if (count && (k < i - 1)) { if (count && (k < i - 1)) {
sprintf (buffer, "%02x", *(op->value + (k >> 1))); sprintf (buffer, "%02x",
__put_user(buffer[0], &buf[k++ - filp->f_pos]); (unsigned char) *(op->value + (k >> 1)) & 0xff);
if (put_user(buffer[0], &buf[k++ - filp->f_pos]))
return -EFAULT;
count--; count--;
} }
if (count) if (count) {
__put_user('\n', &buf [k++ - filp->f_pos]); if (put_user('\n', &buf [k++ - filp->f_pos]))
return -EFAULT;
}
} }
count = k - filp->f_pos; count = k - filp->f_pos;
filp->f_pos = k; filp->f_pos = k;
...@@ -305,7 +327,7 @@ static ssize_t property_write(struct file *filp, const char *buf, ...@@ -305,7 +327,7 @@ static ssize_t property_write(struct file *filp, const char *buf,
void *b; void *b;
openprom_property *op; openprom_property *op;
if (filp->f_pos >= 0xffffff) if (filp->f_pos >= 0xffffff || count >= 0xffffff)
return -EINVAL; return -EINVAL;
if (!filp->private_data) { if (!filp->private_data) {
i = property_read (filp, NULL, 0, 0); i = property_read (filp, NULL, 0, 0);
...@@ -326,7 +348,8 @@ static ssize_t property_write(struct file *filp, const char *buf, ...@@ -326,7 +348,8 @@ static ssize_t property_write(struct file *filp, const char *buf,
if (j == 9) j = 0; if (j == 9) j = 0;
if (!j) { if (!j) {
char ctmp; char ctmp;
__get_user(ctmp, &buf[i]); if (get_user(ctmp, &buf[i]))
return -EFAULT;
if (ctmp != '.') { if (ctmp != '.') {
if (ctmp != '\n') { if (ctmp != '\n') {
if (op->flag & OPP_BINARY) if (op->flag & OPP_BINARY)
...@@ -341,7 +364,8 @@ static ssize_t property_write(struct file *filp, const char *buf, ...@@ -341,7 +364,8 @@ static ssize_t property_write(struct file *filp, const char *buf,
} }
} else { } else {
char ctmp; char ctmp;
__get_user(ctmp, &buf[i]); if (get_user(ctmp, &buf[i]))
return -EFAULT;
if (ctmp < '0' || if (ctmp < '0' ||
(ctmp > '9' && ctmp < 'A') || (ctmp > '9' && ctmp < 'A') ||
(ctmp > 'F' && ctmp < 'a') || (ctmp > 'F' && ctmp < 'a') ||
...@@ -379,8 +403,10 @@ static ssize_t property_write(struct file *filp, const char *buf, ...@@ -379,8 +403,10 @@ static ssize_t property_write(struct file *filp, const char *buf,
last_cnt = (k + count) % 9; last_cnt = (k + count) % 9;
if (first + 1 == last) { if (first + 1 == last) {
memset (tmp, '0', 8); memset (tmp, '0', 8);
copy_from_user (tmp + first_off, buf, if (copy_from_user(tmp + first_off, buf,
(count + first_off > 8) ? 8 - first_off : count); (count + first_off > 8) ?
8 - first_off : count))
return -EFAULT;
mask = 0xffffffff; mask = 0xffffffff;
mask2 = 0xffffffff; mask2 = 0xffffffff;
for (j = 0; j < first_off; j++) for (j = 0; j < first_off; j++)
...@@ -399,8 +425,10 @@ static ssize_t property_write(struct file *filp, const char *buf, ...@@ -399,8 +425,10 @@ static ssize_t property_write(struct file *filp, const char *buf,
if (q == first) { if (q == first) {
if (first_off < 8) { if (first_off < 8) {
memset (tmp, '0', 8); memset (tmp, '0', 8);
copy_from_user (tmp + first_off, buf, if (copy_from_user(tmp + first_off,
8 - first_off); buf,
8 - first_off))
return -EFAULT;
mask = 0xffffffff; mask = 0xffffffff;
for (j = 0; j < first_off; j++) for (j = 0; j < first_off; j++)
mask >>= 1; mask >>= 1;
...@@ -411,7 +439,8 @@ static ssize_t property_write(struct file *filp, const char *buf, ...@@ -411,7 +439,8 @@ static ssize_t property_write(struct file *filp, const char *buf,
} else if ((q == last - 1) && last_cnt } else if ((q == last - 1) && last_cnt
&& (last_cnt < 8)) { && (last_cnt < 8)) {
memset (tmp, '0', 8); memset (tmp, '0', 8);
copy_from_user (tmp, buf, last_cnt); if (copy_from_user(tmp, buf, last_cnt))
return -EFAULT;
mask = 0xffffffff; mask = 0xffffffff;
for (j = 0; j < 8 - last_cnt; j++) for (j = 0; j < 8 - last_cnt; j++)
mask <<= 1; mask <<= 1;
...@@ -421,7 +450,8 @@ static ssize_t property_write(struct file *filp, const char *buf, ...@@ -421,7 +450,8 @@ static ssize_t property_write(struct file *filp, const char *buf,
} else { } else {
char tchars[17]; /* XXX yuck... */ char tchars[17]; /* XXX yuck... */
copy_from_user(tchars, buf, 16); if (copy_from_user(tchars, buf, 16))
return -EFAULT;
*q = simple_strtoul (tchars, 0, 16); *q = simple_strtoul (tchars, 0, 16);
buf += 9; buf += 9;
} }
...@@ -444,7 +474,8 @@ static ssize_t property_write(struct file *filp, const char *buf, ...@@ -444,7 +474,8 @@ static ssize_t property_write(struct file *filp, const char *buf,
*/ */
if (k > 0) if (k > 0)
return -EINVAL; return -EINVAL;
__get_user(ctmp, buf); if (get_user(ctmp, buf))
return -EFAULT;
if (ctmp == '\'') { if (ctmp == '\'') {
op->flag |= OPP_QUOTED; op->flag |= OPP_QUOTED;
buf++; buf++;
...@@ -476,7 +507,8 @@ static ssize_t property_write(struct file *filp, const char *buf, ...@@ -476,7 +507,8 @@ static ssize_t property_write(struct file *filp, const char *buf,
kfree (b); kfree (b);
} }
p = op->value + filp->f_pos - ((op->flag & OPP_QUOTED) ? 1 : 0); p = op->value + filp->f_pos - ((op->flag & OPP_QUOTED) ? 1 : 0);
copy_from_user (p, buf, count); if (copy_from_user(p, buf, count))
return -EFAULT;
op->flag |= OPP_DIRTY; op->flag |= OPP_DIRTY;
for (i = 0; i < count; i++, p++) for (i = 0; i < count; i++, p++)
if (*p == '\n') { if (*p == '\n') {
......
...@@ -144,7 +144,7 @@ static int romfs_fill_super(struct super_block *s, void *data, int silent) ...@@ -144,7 +144,7 @@ static int romfs_fill_super(struct super_block *s, void *data, int silent)
} }
s->s_magic = ROMFS_MAGIC; s->s_magic = ROMFS_MAGIC;
s->u.generic_sbp = (void *)sz; s->u.generic_sbp = (void *)(long)sz;
s->s_flags |= MS_RDONLY; s->s_flags |= MS_RDONLY;
......
...@@ -8,7 +8,41 @@ ...@@ -8,7 +8,41 @@
#define PTREGS_OFF (STACK_BIAS + REGWIN_SZ) #define PTREGS_OFF (STACK_BIAS + REGWIN_SZ)
#define CHEETAH_ID 0x003e0014 #define __CHEETAH_ID 0x003e0014
#define CHEETAH_PLUS_ID 0x003e0015
#define CHEETAH_MANUF 0x003e
#define CHEETAH_IMPL 0x0014
#define CHEETAH_PLUS_IMPL 0x0015
#define BRANCH_IF_CHEETAH_BASE(tmp1,tmp2,label) \
rdpr %ver, %tmp1; \
sethi %hi(__CHEETAH_ID), %tmp2; \
srlx %tmp1, 32, %tmp1; \
or %tmp2, %lo(__CHEETAH_ID), %tmp2;\
cmp %tmp1, %tmp2; \
be,pn %icc, label; \
nop;
#define BRANCH_IF_CHEETAH_PLUS_OR_FOLLOWON(tmp1,tmp2,label) \
rdpr %ver, %tmp1; \
srlx %tmp1, (32 + 16), %tmp2; \
cmp %tmp2, CHEETAH_MANUF; \
bne,pt %xcc, 99f; \
sllx %tmp1, 16, %tmp1; \
srlx %tmp1, (32 + 16), %tmp2; \
cmp %tmp2, CHEETAH_PLUS_IMPL; \
bgeu,pt %xcc, label; \
99: nop;
#define BRANCH_IF_ANY_CHEETAH(tmp1,tmp2,label) \
rdpr %ver, %tmp1; \
srlx %tmp1, (32 + 16), %tmp2; \
cmp %tmp2, CHEETAH_MANUF; \
bne,pt %xcc, 99f; \
sllx %tmp1, 16, %tmp1; \
srlx %tmp1, (32 + 16), %tmp2; \
cmp %tmp2, CHEETAH_IMPL; \
bgeu,pt %xcc, label; \
99: nop;
#endif /* !(_SPARC64_HEAD_H) */ #endif /* !(_SPARC64_HEAD_H) */
#ifndef _ASM_KMAP_TYPES_H
#define _ASM_KMAP_TYPES_H
/* Dummy header just to define km_type. None of this
* is actually used on sparc64. -DaveM
*/
enum km_type {
KM_BOUNCE_READ,
KM_SKB_SUNRPC_DATA,
KM_SKB_DATA_SOFTIRQ,
KM_USER0,
KM_USER1,
KM_BIO_SRC_IRQ,
KM_BIO_DST_IRQ,
KM_PTE0,
KM_PTE1,
KM_IRQ0,
KM_IRQ1,
KM_TYPE_NR
};
#endif
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
#include <linux/config.h> #include <linux/config.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/mm.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/spitfire.h> #include <asm/spitfire.h>
......
...@@ -37,11 +37,12 @@ enum { ...@@ -37,11 +37,12 @@ enum {
IPPROTO_IPV6 = 41, /* IPv6-in-IPv4 tunnelling */ IPPROTO_IPV6 = 41, /* IPv6-in-IPv4 tunnelling */
IPPROTO_PIM = 103, /* Protocol Independent Multicast */
IPPROTO_ESP = 50, /* Encapsulation Security Payload protocol */ IPPROTO_ESP = 50, /* Encapsulation Security Payload protocol */
IPPROTO_AH = 51, /* Authentication Header protocol */ IPPROTO_AH = 51, /* Authentication Header protocol */
IPPROTO_PIM = 103, /* Protocol Independent Multicast */
IPPROTO_COMP = 108, /* Compression Header protocol */ IPPROTO_COMP = 108, /* Compression Header protocol */
IPPROTO_SCTP = 132, /* Stream Control Transport Protocol */
IPPROTO_RAW = 255, /* Raw IP packets */ IPPROTO_RAW = 255, /* Raw IP packets */
IPPROTO_MAX IPPROTO_MAX
......
...@@ -137,6 +137,7 @@ extern int sock_sendmsg(struct socket *, struct msghdr *m, int len); ...@@ -137,6 +137,7 @@ extern int sock_sendmsg(struct socket *, struct msghdr *m, int len);
extern int sock_recvmsg(struct socket *, struct msghdr *m, int len, int flags); extern int sock_recvmsg(struct socket *, struct msghdr *m, int len, int flags);
extern int sock_readv_writev(int type, struct inode * inode, struct file * file, extern int sock_readv_writev(int type, struct inode * inode, struct file * file,
const struct iovec * iov, long count, long size); const struct iovec * iov, long count, long size);
extern int sock_map_fd(struct socket *sock);
extern int net_ratelimit(void); extern int net_ratelimit(void);
extern unsigned long net_random(void); extern unsigned long net_random(void);
......
...@@ -365,6 +365,7 @@ struct net_device ...@@ -365,6 +365,7 @@ struct net_device
#define NETIF_F_HW_VLAN_RX 256 /* Receive VLAN hw acceleration */ #define NETIF_F_HW_VLAN_RX 256 /* Receive VLAN hw acceleration */
#define NETIF_F_HW_VLAN_FILTER 512 /* Receive filtering on VLAN */ #define NETIF_F_HW_VLAN_FILTER 512 /* Receive filtering on VLAN */
#define NETIF_F_VLAN_CHALLENGED 1024 /* Device cannot handle VLAN packets */ #define NETIF_F_VLAN_CHALLENGED 1024 /* Device cannot handle VLAN packets */
#define NETIF_F_TSO 2048 /* Can offload TCP/IP segmentation */
/* Called after device is detached from network. */ /* Called after device is detached from network. */
void (*uninit)(struct net_device *dev); void (*uninit)(struct net_device *dev);
......
This diff is collapsed.
...@@ -109,7 +109,8 @@ struct sk_buff_head { ...@@ -109,7 +109,8 @@ struct sk_buff_head {
struct sk_buff; struct sk_buff;
#define MAX_SKB_FRAGS 6 /* To allow 64K frame to be packed as single skb without frag_list */
#define MAX_SKB_FRAGS (65536/PAGE_SIZE + 2)
typedef struct skb_frag_struct skb_frag_t; typedef struct skb_frag_struct skb_frag_t;
...@@ -125,6 +126,8 @@ struct skb_frag_struct { ...@@ -125,6 +126,8 @@ struct skb_frag_struct {
struct skb_shared_info { struct skb_shared_info {
atomic_t dataref; atomic_t dataref;
unsigned int nr_frags; unsigned int nr_frags;
unsigned short tso_size;
unsigned short tso_segs;
struct sk_buff *frag_list; struct sk_buff *frag_list;
skb_frag_t frags[MAX_SKB_FRAGS]; skb_frag_t frags[MAX_SKB_FRAGS];
}; };
......
...@@ -227,6 +227,7 @@ struct ucred { ...@@ -227,6 +227,7 @@ struct ucred {
#define SOL_UDP 17 #define SOL_UDP 17
#define SOL_IPV6 41 #define SOL_IPV6 41
#define SOL_ICMPV6 58 #define SOL_ICMPV6 58
#define SOL_SCTP 132
#define SOL_RAW 255 #define SOL_RAW 255
#define SOL_IPX 256 #define SOL_IPX 256
#define SOL_AX25 257 #define SOL_AX25 257
......
...@@ -172,6 +172,7 @@ enum ...@@ -172,6 +172,7 @@ enum
NET_TR=14, NET_TR=14,
NET_DECNET=15, NET_DECNET=15,
NET_ECONET=16, NET_ECONET=16,
NET_SCTP=17,
}; };
/* /proc/sys/kernel/random */ /* /proc/sys/kernel/random */
...@@ -516,6 +517,21 @@ enum { ...@@ -516,6 +517,21 @@ enum {
NET_DECNET_CONF_DEV_STATE = 7 NET_DECNET_CONF_DEV_STATE = 7
}; };
/* /proc/sys/net/sctp */
enum {
NET_SCTP_RTO_INITIAL = 1,
NET_SCTP_RTO_MIN = 2,
NET_SCTP_RTO_MAX = 3,
NET_SCTP_RTO_ALPHA = 4,
NET_SCTP_RTO_BETA = 5,
NET_SCTP_VALID_COOKIE_LIFE = 6,
NET_SCTP_ASSOCIATION_MAX_RETRANS = 7,
NET_SCTP_PATH_MAX_RETRANS = 8,
NET_SCTP_MAX_INIT_RETRANSMITS = 9,
NET_SCTP_HB_INTERVAL = 10,
NET_SCTP_MAX_BURST = 11,
};
/* CTL_PROC names: */ /* CTL_PROC names: */
/* CTL_FS names: */ /* CTL_FS names: */
......
...@@ -241,7 +241,8 @@ struct tcp_opt { ...@@ -241,7 +241,8 @@ struct tcp_opt {
__u32 snd_wnd; /* The window we expect to receive */ __u32 snd_wnd; /* The window we expect to receive */
__u32 max_window; /* Maximal window ever seen from peer */ __u32 max_window; /* Maximal window ever seen from peer */
__u32 pmtu_cookie; /* Last pmtu seen by socket */ __u32 pmtu_cookie; /* Last pmtu seen by socket */
__u16 mss_cache; /* Cached effective mss, not including SACKS */ __u32 mss_cache; /* Cached effective mss, not including SACKS */
__u16 mss_cache_std; /* Like mss_cache, but without TSO */
__u16 mss_clamp; /* Maximal mss, negotiated at connection setup */ __u16 mss_clamp; /* Maximal mss, negotiated at connection setup */
__u16 ext_header_len; /* Network protocol overhead (IP/IPv6 options) */ __u16 ext_header_len; /* Network protocol overhead (IP/IPv6 options) */
__u8 ca_state; /* State of fast-retransmit machine */ __u8 ca_state; /* State of fast-retransmit machine */
......
...@@ -43,6 +43,14 @@ extern void inet_sock_release(struct sock *sk); ...@@ -43,6 +43,14 @@ extern void inet_sock_release(struct sock *sk);
extern void inet_sock_destruct(struct sock *sk); extern void inet_sock_destruct(struct sock *sk);
extern atomic_t inet_sock_nr; extern atomic_t inet_sock_nr;
extern int inet_bind(struct socket *sock,
struct sockaddr *uaddr, int addr_len);
extern int inet_getname(struct socket *sock,
struct sockaddr *uaddr,
int *uaddr_len, int peer);
extern int inet_ioctl(struct socket *sock,
unsigned int cmd, unsigned long arg);
#endif #endif
...@@ -53,12 +53,13 @@ static inline void inet_putpeer(struct inet_peer *p) ...@@ -53,12 +53,13 @@ static inline void inet_putpeer(struct inet_peer *p)
extern spinlock_t inet_peer_idlock; extern spinlock_t inet_peer_idlock;
/* can be called with or without local BH being disabled */ /* can be called with or without local BH being disabled */
static inline __u16 inet_getid(struct inet_peer *p) static inline __u16 inet_getid(struct inet_peer *p, int more)
{ {
__u16 id; __u16 id;
spin_lock_bh(&inet_peer_idlock); spin_lock_bh(&inet_peer_idlock);
id = p->ip_id_count++; id = p->ip_id_count;
p->ip_id_count += 1 + more;
spin_unlock_bh(&inet_peer_idlock); spin_unlock_bh(&inet_peer_idlock);
return id; return id;
} }
......
...@@ -187,7 +187,7 @@ int ip_dont_fragment(struct sock *sk, struct dst_entry *dst) ...@@ -187,7 +187,7 @@ int ip_dont_fragment(struct sock *sk, struct dst_entry *dst)
!(dst->mxlock&(1<<RTAX_MTU)))); !(dst->mxlock&(1<<RTAX_MTU))));
} }
extern void __ip_select_ident(struct iphdr *iph, struct dst_entry *dst); extern void __ip_select_ident(struct iphdr *iph, struct dst_entry *dst, int more);
static inline void ip_select_ident(struct iphdr *iph, struct dst_entry *dst, struct sock *sk) static inline void ip_select_ident(struct iphdr *iph, struct dst_entry *dst, struct sock *sk)
{ {
...@@ -200,7 +200,19 @@ static inline void ip_select_ident(struct iphdr *iph, struct dst_entry *dst, str ...@@ -200,7 +200,19 @@ static inline void ip_select_ident(struct iphdr *iph, struct dst_entry *dst, str
iph->id = (sk && inet_sk(sk)->daddr) ? iph->id = (sk && inet_sk(sk)->daddr) ?
htons(inet_sk(sk)->id++) : 0; htons(inet_sk(sk)->id++) : 0;
} else } else
__ip_select_ident(iph, dst); __ip_select_ident(iph, dst, 0);
}
static inline void ip_select_ident_more(struct iphdr *iph, struct dst_entry *dst, struct sock *sk, int more)
{
if (iph->frag_off&__constant_htons(IP_DF)) {
if (sk && inet_sk(sk)->daddr) {
iph->id = htons(inet_sk(sk)->id);
inet_sk(sk)->id += 1 + more;
} else
iph->id = 0;
} else
__ip_select_ident(iph, dst, more);
} }
/* /*
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* Authors: * Authors:
* Pedro Roque <roque@di.fc.ul.pt> * Pedro Roque <roque@di.fc.ul.pt>
* *
* $Id: ipv6.h,v 1.23 2000/12/13 18:31:48 davem Exp $ * $Id: ipv6.h,v 1.1 2002/05/20 15:13:07 jgrimm Exp $
* *
* This program is free software; you can redistribute it and/or * This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License * modify it under the terms of the GNU General Public License
...@@ -336,6 +336,14 @@ extern void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, u16 ...@@ -336,6 +336,14 @@ extern void ipv6_icmp_error(struct sock *sk, struct sk_buff *skb, int err, u16
u32 info, u8 *payload); u32 info, u8 *payload);
extern void ipv6_local_error(struct sock *sk, int err, struct flowi *fl, u32 info); extern void ipv6_local_error(struct sock *sk, int err, struct flowi *fl, u32 info);
extern int inet6_release(struct socket *sock);
extern int inet6_bind(struct socket *sock, struct sockaddr *uaddr,
int addr_len);
extern int inet6_getname(struct socket *sock, struct sockaddr *uaddr,
int *uaddr_len, int peer);
extern int inet6_ioctl(struct socket *sock, unsigned int cmd,
unsigned long arg);
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* _NET_IPV6_H */ #endif /* _NET_IPV6_H */
......
This diff is collapsed.
/* SCTP kernel reference Implementation Copyright (C) 1999-2001
* Cisco, Motorola, and IBM
*
* This file is part of the SCTP kernel reference Implementation
*
* $Header: /cvsroot/lksctp/lksctp/sctp_cvs/include/net/sctp/sctp_command.h,v 1.19 2002/08/16 19:30:49 jgrimm Exp $
*
* These are the definitions needed for the command object.
*
* The SCTP reference implementation is free software;
* you can redistribute it and/or modify it under the terms of
* the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* the SCTP reference implementation is distributed in the hope that it
* will be useful, but WITHOUT ANY WARRANTY; without even the implied
* ************************
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU CC; see the file COPYING. If not, write to
* the Free Software Foundation, 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
* Please send any bug reports or fixes you make to one of the
* following email addresses:
*
* La Monte H.P. Yarroll <piggy@acm.org>
* Karl Knutson <karl@athena.chicago.il.us>
*
* Any bugs reported given to us we will try to fix... any fixes shared will
* be incorporated into the next SCTP release.
*/
#ifndef __net_sctp_command_h__
#define __net_sctp_command_h__
#include <net/sctp/sctp_constants.h>
#include <net/sctp/sctp_structs.h>
typedef enum {
SCTP_CMD_NOP = 0, /* Do nothing. */
SCTP_CMD_NEW_ASOC, /* Register a new association. */
SCTP_CMD_DELETE_TCB, /* Delete the current association. */
SCTP_CMD_NEW_STATE, /* Enter a new state. */
SCTP_CMD_REPORT_TSN, /* Record the arrival of a TSN. */
SCTP_CMD_GEN_SACK, /* Send a Selective ACK (maybe). */
SCTP_CMD_PROCESS_SACK, /* Process an inbound SACK. */
SCTP_CMD_GEN_INIT_ACK, /* Generate an INIT ACK chunk. */
SCTP_CMD_PEER_INIT, /* Process a INIT from the peer. */
SCTP_CMD_GEN_COOKIE_ECHO, /* Generate a COOKIE ECHO chunk. */
SCTP_CMD_CHUNK_ULP, /* Send a chunk to the sockets layer. */
SCTP_CMD_EVENT_ULP, /* Send a notification to the sockets layer. */
SCTP_CMD_REPLY, /* Send a chunk to our peer. */
SCTP_CMD_SEND_PKT, /* Send a full packet to our peer. */
SCTP_CMD_RETRAN, /* Mark a transport for retransmission. */
SCTP_CMD_ECN_CE, /* Do delayed CE processing. */
SCTP_CMD_ECN_ECNE, /* Do delayed ECNE processing. */
SCTP_CMD_ECN_CWR, /* Do delayed CWR processing. */
SCTP_CMD_TIMER_START, /* Start a timer. */
SCTP_CMD_TIMER_RESTART, /* Restart a timer. */
SCTP_CMD_TIMER_STOP, /* Stop a timer. */
SCTP_CMD_COUNTER_RESET, /* Reset a counter. */
SCTP_CMD_COUNTER_INC, /* Increment a counter. */
SCTP_CMD_INIT_RESTART, /* High level, do init timer work. */
SCTP_CMD_INIT_FAILED, /* High level, do init failure work. */
SCTP_CMD_REPORT_DUP, /* Report a duplicate TSN. */
SCTP_CMD_REPORT_BIGGAP, /* Narc on a TSN (it was too high). */
SCTP_CMD_SET_BIND_ADDR, /* Set the association bind_addr. */
SCTP_CMD_STRIKE, /* Mark a strike against a transport. */
SCTP_CMD_TRANSMIT, /* Transmit the outqueue. */
SCTP_CMD_HB_TIMERS_START, /* Start the heartbeat timers. */
SCTP_CMD_TRANSPORT_RESET, /* Reset the status of a transport. */
SCTP_CMD_TRANSPORT_ON, /* Mark the transport as active. */
SCTP_CMD_REPORT_ERROR, /* Pass this error back out of the sm. */
SCTP_CMD_REPORT_BAD_TAG, /* Verification tags didn't match. */
SCTP_CMD_PROCESS_CTSN, /* Sideeffect from shutdown. */
SCTP_CMD_ASSOC_FAILED, /* Handle association failure. */
SCTP_CMD_DISCARD_PACKET, /* Discard the whole packet. */
SCTP_CMD_GEN_SHUTDOWN, /* Generate a SHUTDOWN chunk. */
SCTP_CMD_UPDATE_ASSOC, /* Update association information. */
SCTP_CMD_PURGE_OUTQUEUE, /* Purge all data waiting to be sent. */
SCTP_CMD_SETUP_T2, /* Hi-level, setup T2-shutdown parms. */
SCTP_CMD_LAST
} sctp_verb_t;
#define SCTP_CMD_MAX (SCTP_CMD_LAST - 1)
#define SCTP_CMD_NUM_VERBS (SCTP_CMD_MAX + 1)
/* How many commands can you put in an sctp_cmd_seq_t?
* This is a rather arbitrary number, ideally derived from a careful
* analysis of the state functions, but in reality just taken from
* thin air in the hopes othat we don't trigger a kernel panic.
*/
#define SCTP_MAX_NUM_COMMANDS 14
typedef union {
__s32 i32;
__u32 u32;
__u16 u16;
__u8 u8;
int error;
sctp_state_t state;
sctp_event_timeout_t to;
sctp_counter_t counter;
void *ptr;
sctp_chunk_t *chunk;
sctp_association_t *asoc;
sctp_transport_t *transport;
sctp_bind_addr_t *bp;
sctp_init_chunk_t *init;
sctp_ulpevent_t *ulpevent;
sctp_packet_t *packet;
sctp_sackhdr_t *sackh;
} sctp_arg_t;
/* We are simulating ML type constructors here.
*
* SCTP_ARG_CONSTRUCTOR(NAME, TYPE, ELT) builds a function called
* SCTP_NAME() which takes an argument of type TYPE and returns an
* sctp_arg_t. It does this by inserting the sole argument into the
* ELT union element of a local sctp_arg_t.
*
* E.g., SCTP_ARG_CONSTRUCTOR(I32, __s32, i32) builds SCTP_I32(arg),
* which takes an __s32 and returns a sctp_arg_t containing the
* __s32. So, after foo = SCTP_I32(arg), foo.i32 == arg.
*/
static inline sctp_arg_t SCTP_NULL(void)
{
sctp_arg_t retval; retval.ptr = NULL; return retval;
}
static inline sctp_arg_t SCTP_NOFORCE(void)
{
sctp_arg_t retval; retval.i32 = 0; return retval;
}
static inline sctp_arg_t SCTP_FORCE(void)
{
sctp_arg_t retval; retval.i32 = 1; return retval;
}
#define SCTP_ARG_CONSTRUCTOR(name, type, elt) \
static inline sctp_arg_t \
SCTP_## name (type arg) \
{ sctp_arg_t retval; retval.elt = arg; return retval; }
SCTP_ARG_CONSTRUCTOR(I32, __s32, i32)
SCTP_ARG_CONSTRUCTOR(U32, __u32, u32)
SCTP_ARG_CONSTRUCTOR(U16, __u16, u16)
SCTP_ARG_CONSTRUCTOR(U8, __u8, u8)
SCTP_ARG_CONSTRUCTOR(ERROR, int, error)
SCTP_ARG_CONSTRUCTOR(STATE, sctp_state_t, state)
SCTP_ARG_CONSTRUCTOR(COUNTER, sctp_counter_t, counter)
SCTP_ARG_CONSTRUCTOR(TO, sctp_event_timeout_t, to)
SCTP_ARG_CONSTRUCTOR(PTR, void *, ptr)
SCTP_ARG_CONSTRUCTOR(CHUNK, sctp_chunk_t *, chunk)
SCTP_ARG_CONSTRUCTOR(ASOC, sctp_association_t *, asoc)
SCTP_ARG_CONSTRUCTOR(TRANSPORT, sctp_transport_t *, transport)
SCTP_ARG_CONSTRUCTOR(BA, sctp_bind_addr_t *, bp)
SCTP_ARG_CONSTRUCTOR(PEER_INIT, sctp_init_chunk_t *, init)
SCTP_ARG_CONSTRUCTOR(ULPEVENT, sctp_ulpevent_t *, ulpevent)
SCTP_ARG_CONSTRUCTOR(PACKET, sctp_packet_t *, packet)
SCTP_ARG_CONSTRUCTOR(SACKH, sctp_sackhdr_t *, sackh)
typedef struct {
sctp_arg_t obj;
sctp_verb_t verb;
} sctp_cmd_t;
typedef struct {
sctp_cmd_t cmds[SCTP_MAX_NUM_COMMANDS];
__u8 next_free_slot;
__u8 next_cmd;
} sctp_cmd_seq_t;
/* Create a new sctp_command_sequence.
* Return NULL if creating a new sequence fails.
*/
sctp_cmd_seq_t *sctp_new_cmd_seq(int priority);
/* Initialize a block of memory as a command sequence.
* Return 0 if the initialization fails.
*/
int sctp_init_cmd_seq(sctp_cmd_seq_t *seq);
/* Add a command to an sctp_cmd_seq_t.
* Return 0 if the command sequence is full.
*
* Use the SCTP_* constructors defined by SCTP_ARG_CONSTRUCTOR() above
* to wrap data which goes in the obj argument.
*/
int sctp_add_cmd(sctp_cmd_seq_t *seq, sctp_verb_t verb, sctp_arg_t obj);
/* Rewind an sctp_cmd_seq_t to iterate from the start.
* Return 0 if the rewind fails.
*/
int sctp_rewind_sequence(sctp_cmd_seq_t *seq);
/* Return the next command structure in an sctp_cmd_seq.
* Return NULL at the end of the sequence.
*/
sctp_cmd_t *sctp_next_cmd(sctp_cmd_seq_t *seq);
/* Dispose of a command sequence. */
void sctp_free_cmd_seq(sctp_cmd_seq_t *seq);
#endif /* __net_sctp_command_h__ */
This diff is collapsed.
/* SCTP reference Implementation
* Copyright (C) 1999 Cisco, Inc.
* Copyright (C) 1999 Motorola, Inc.
*
* This file originates from Randy Stewart's SCTP reference Implementation.
*
* The SCTP reference implementation is distributed in the hope that it
* will be useful, but WITHOUT ANY WARRANTY; without even the implied
* ************************
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU CC; see the file COPYING. If not, write to
* the Free Software Foundation, 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
* Please send any bug reports or fixes you make to the
* email address(es):
* lksctp developers <lksctp-developers@lists.sourceforge.net>
*
* Or submit a bug report through the following website:
* http://www.sf.net/projects/lksctp
*
* Written or modified by:
* Randy Stewart <rstewar1@email.mot.com>
* Ken Morneau <kmorneau@cisco.com>
* Qiaobing Xie <qxie1@email.mot.com>
*/
#ifndef __SLA1_h__
#define __SLA1_h__
struct SLA_1_Context {
unsigned int A;
unsigned int B;
unsigned int C;
unsigned int D;
unsigned int E;
unsigned int H0;
unsigned int H1;
unsigned int H2;
unsigned int H3;
unsigned int H4;
unsigned int words[80];
unsigned int TEMP;
/* block I am collecting to process */
char SLAblock[64];
/* collected so far */
int howManyInBlock;
unsigned int runningTotal;
};
#define F1(B,C,D) (((B & C) | ((~B) & D))) /* 0 <= t <= 19 */
#define F2(B,C,D) (B ^ C ^ D) /* 20 <= t <= 39 */
#define F3(B,C,D) ((B & C) | (B & D) | (C & D)) /* 40 <= t <= 59 */
#define F4(B,C,D) (B ^ C ^ D) /*600 <= t <= 79 */
/* circular shift */
#define CSHIFT(A,B) ((B << A) | (B >> (32-A)))
#define K1 0x5a827999 /* 0 <= t <= 19 */
#define K2 0x6ed9eba1 /* 20 <= t <= 39 */
#define K3 0x8f1bbcdc /* 40 <= t <= 59 */
#define K4 0xca62c1d6 /* 60 <= t <= 79 */
#define H0INIT 0x67452301
#define H1INIT 0xefcdab89
#define H2INIT 0x98badcfe
#define H3INIT 0x10325476
#define H4INIT 0xc3d2e1f0
extern void SLA1_Init(struct SLA_1_Context *);
extern void SLA1_Process(struct SLA_1_Context *, const unsigned char *, int);
extern void SLA1_Final(struct SLA_1_Context *, unsigned char *);
#endif
This diff is collapsed.
This diff is collapsed.
/* SCTP kernel reference Implementation Copyright (C) 1999-2001
* Cisco, Motorola, Intel, and International Business Machines Corp.
*
* This file is part of the SCTP kernel reference Implementation
*
* $Header: /cvsroot/lksctp/lksctp/sctp_cvs/include/net/sctp/sctp_tsnmap.h,v 1.8 2002/07/16 14:51:58 jgrimm Exp $
*
* These are the definitions needed for the tsnmap type. The tsnmap is used
* to track out of order TSNs received.
*
* The SCTP reference implementation is free software;
* you can redistribute it and/or modify it under the terms of
* the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* the SCTP reference implementation is distributed in the hope that it
* will be useful, but WITHOUT ANY WARRANTY; without even the implied
* ************************
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU CC; see the file COPYING. If not, write to
* the Free Software Foundation, 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
* Please send any bug reports or fixes you make to one of the
* following email addresses:
*
* Jon Grimm <jgrimm@us.ibm.com>
* La Monte H.P. Yarroll <piggy@acm.org>
* Karl Knutson <karl@athena.chicago.il.us>
*
* Any bugs reported given to us we will try to fix... any fixes shared will
* be incorporated into the next SCTP release.
*/
#include <net/sctp/sctp_constants.h>
#ifndef __sctp_tsnmap_h__
#define __sctp_tsnmap_h__
/* RFC 2960 12.2 Parameters necessary per association (i.e. the TCB)
* Mapping An array of bits or bytes indicating which out of
* Array order TSN's have been received (relative to the
* Last Rcvd TSN). If no gaps exist, i.e. no out of
* order packets have been received, this array
* will be set to all zero. This structure may be
* in the form of a circular buffer or bit array.
*/
typedef struct sctp_tsnmap {
/* This array counts the number of chunks with each TSN.
* It points at one of the two buffers with which we will
* ping-pong between.
*/
__u8 *tsn_map;
/* This marks the tsn which overflows the tsn_map, when the
* cumulative ack point reaches this point we know we can switch
* maps (tsn_map and overflow_map swap).
*/
__u32 overflow_tsn;
/* This is the overflow array for tsn_map.
* It points at one of the other ping-pong buffers.
*/
__u8 *overflow_map;
/* This is the TSN at tsn_map[0]. */
__u32 base_tsn;
/* Last Rcvd : This is the last TSN received in
* TSN : sequence. This value is set initially by
* : taking the peer's Initial TSN, received in
* : the INIT or INIT ACK chunk, and subtracting
* : one from it.
*
* Throughout most of the specification this is called the
* "Cumulative TSN ACK Point". In this case, we
* ignore the advice in 12.2 in favour of the term
* used in the bulk of the text.
*/
__u32 cumulative_tsn_ack_point;
/* This is the minimum number of TSNs we can track. This corresponds
* to the size of tsn_map. Note: the overflow_map allows us to
* potentially track more than this quantity.
*/
__u16 len;
/* This is the highest TSN we've marked. */
__u32 max_tsn_seen;
/* No. of data chunks pending receipt. used by SCTP_STATUS sockopt */
__u16 pending_data;
int malloced;
__u8 raw_map[0];
} sctp_tsnmap_t;
typedef struct sctp_tsnmap_iter {
__u32 start;
} sctp_tsnmap_iter_t;
/* Create a new tsnmap. */
sctp_tsnmap_t *sctp_tsnmap_new(__u16 len, __u32 initial_tsn,
int priority);
/* Dispose of a tsnmap. */
void sctp_tsnmap_free(sctp_tsnmap_t *map);
/* This macro assists in creation of external storage for variable length
* internal buffers. We double allocate so the overflow map works.
*/
#define sctp_tsnmap_storage_size(count) (sizeof(__u8) * (count) * 2)
/* Initialize a block of memory as a tsnmap. */
sctp_tsnmap_t *sctp_tsnmap_init(sctp_tsnmap_t *map, __u16 len, __u32 initial_tsn);
/* Test the tracking state of this TSN.
* Returns:
* 0 if the TSN has not yet been seen
* >0 if the TSN has been seen (duplicate)
* <0 if the TSN is invalid (too large to track)
*/
int sctp_tsnmap_check(const sctp_tsnmap_t *map, __u32 tsn);
/* Mark this TSN as seen. */
void sctp_tsnmap_mark(sctp_tsnmap_t *map, __u32 tsn);
/* Retrieve the Cumulative TSN ACK Point. */
__u32 sctp_tsnmap_get_ctsn(const sctp_tsnmap_t *map);
/* Retrieve the highest TSN we've seen. */
__u32 sctp_tsnmap_get_max_tsn_seen(const sctp_tsnmap_t *map);
/* Is there a gap in the TSN map? */
int sctp_tsnmap_has_gap(const sctp_tsnmap_t *map);
/* Initialize a gap ack block interator from user-provided memory. */
void sctp_tsnmap_iter_init(const sctp_tsnmap_t *map, sctp_tsnmap_iter_t *iter);
/* Get the next gap ack blocks. We return 0 if there are no more
* gap ack blocks.
*/
int sctp_tsnmap_next_gap_ack(const sctp_tsnmap_t *map, sctp_tsnmap_iter_t *iter,
__u16 *start, __u16 *end);
#endif /* __sctp_tsnmap_h__ */
/* SCTP kernel reference Implementation
* Copyright (c) 1999-2000 Cisco, Inc.
* Copyright (c) 1999-2001 Motorola, Inc.
* Copyright (c) 2001 International Business Machines, Corp.
* Copyright (c) 2001 Intel Corp.
* Copyright (c) 2001 Nokia, Inc.
* Copyright (c) 2001 La Monte H.P. Yarroll
*
* $Header: /cvsroot/lksctp/lksctp/sctp_cvs/include/net/sctp/sctp_ulpevent.h,v 1.5 2002/07/12 14:50:25 jgrimm Exp $
*
* These are the definitions needed for the sctp_ulpevent type. The
* sctp_ulpevent type is used to carry information from the state machine
* upwards to the ULP.
*
* The SCTP reference implementation is free software;
* you can redistribute it and/or modify it under the terms of
* the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* the SCTP reference implementation is distributed in the hope that it
* will be useful, but WITHOUT ANY WARRANTY; without even the implied
* ************************
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU CC; see the file COPYING. If not, write to
* the Free Software Foundation, 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
* Please send any bug reports or fixes you make to one of the
* following email addresses:
*
* Jon Grimm <jgrimm@us.ibm.com>
* La Monte H.P. Yarroll <piggy@acm.org>
* Karl Knutson <karl@athena.chicago.il.us>
*
* Any bugs reported given to us we will try to fix... any fixes shared will
* be incorporated into the next SCTP release.
*/
#ifndef __sctp_ulpevent_h__
#define __sctp_ulpevent_h__
/* A structure to carry information to the ULP (e.g. Sockets API) */
/* Warning: This sits inside an skb.cb[] area. Be very careful of
* growing this structure as it is at the maximum limit now.
*/
typedef struct sctp_ulpevent {
int malloced;
sctp_association_t *asoc;
struct sk_buff *parent;
struct sctp_sndrcvinfo sndrcvinfo;
int chunk_flags; /* Temp. until we get a new chunk_t */
int msg_flags;
} sctp_ulpevent_t;
sctp_ulpevent_t *sctp_ulpevent_new(int size, int msg_flags, int priority);
sctp_ulpevent_t *sctp_ulpevent_init(sctp_ulpevent_t *event, struct sk_buff *skb, int msg_flags);
void sctp_ulpevent_free(sctp_ulpevent_t *event);
int sctp_ulpevent_is_notification(const sctp_ulpevent_t *event);
sctp_ulpevent_t *sctp_ulpevent_make_assoc_change(
const struct SCTP_association *asoc,
__u16 flags,
__u16 state,
__u16 error,
__u16 outbound,
__u16 inbound,
int priority);
sctp_ulpevent_t *sctp_ulpevent_make_peer_addr_change(
const struct SCTP_association *asoc,
const struct sockaddr_storage *aaddr,
int flags,
int state,
int error,
int priority);
sctp_ulpevent_t *sctp_ulpevent_make_remote_error(
const struct SCTP_association *asoc,
struct SCTP_chunk *chunk,
__u16 flags,
int priority);
sctp_ulpevent_t *sctp_ulpevent_make_send_failed(
const struct SCTP_association *asoc,
struct SCTP_chunk *chunk,
__u16 flags,
__u32 error,
int priority);
sctp_ulpevent_t *sctp_ulpevent_make_shutdown_event(
const struct SCTP_association *asoc,
__u16 flags,
int priority);
sctp_ulpevent_t *sctp_ulpevent_make_rcvmsg(struct SCTP_association *asoc,
struct SCTP_chunk *chunk,
int priority);
void sctp_ulpevent_read_sndrcvinfo(const sctp_ulpevent_t *event,
struct msghdr *msghdr);
__u16 sctp_ulpevent_get_notification_type(const sctp_ulpevent_t *event);
/* Given an event subscription, is this event enabled? */
static inline int sctp_ulpevent_is_enabled(const sctp_ulpevent_t *event,
const struct sctp_event_subscribe *mask)
{
const char *amask = (const char *) mask;
__u16 sn_type;
int enabled = 1;
if (sctp_ulpevent_is_notification(event)) {
sn_type = sctp_ulpevent_get_notification_type(event);
enabled = amask[sn_type - SCTP_SN_TYPE_BASE];
}
return enabled;
}
#endif /* __sctp_ulpevent_h__ */
/* SCTP kernel reference Implementation
* Copyright (c) 1999-2000 Cisco, Inc.
* Copyright (c) 1999-2001 Motorola, Inc.
* Copyright (c) 2001 International Business Machines, Corp.
* Copyright (c) 2001 Intel Corp.
* Copyright (c) 2001 Nokia, Inc.
* Copyright (c) 2001 La Monte H.P. Yarroll
*
* $Header: /cvsroot/lksctp/lksctp/sctp_cvs/include/net/sctp/sctp_ulpqueue.h,v 1.2 2002/07/12 14:50:25 jgrimm Exp $
*
* These are the definitions needed for the sctp_ulpqueue type. The
* sctp_ulpqueue is the interface between the Upper Layer Protocol, or ULP,
* and the core SCTP state machine. This is the component which handles
* reassembly and ordering.
*
* The SCTP reference implementation is free software;
* you can redistribute it and/or modify it under the terms of
* the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* the SCTP reference implementation is distributed in the hope that it
* will be useful, but WITHOUT ANY WARRANTY; without even the implied
* ************************
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GNU CC; see the file COPYING. If not, write to
* the Free Software Foundation, 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*
* Please send any bug reports or fixes you make to one of the
* following email addresses:
*
* Jon Grimm <jgrimm@us.ibm.com>
* La Monte H.P. Yarroll <piggy@acm.org>
*
* Any bugs reported given to us we will try to fix... any fixes shared will
* be incorporated into the next SCTP release.
*/
#ifndef __sctp_ulpqueue_h__
#define __sctp_ulpqueue_h__
/* A structure to carry information to the ULP (e.g. Sockets API) */
typedef struct sctp_ulpqueue {
int malloced;
spinlock_t lock;
sctp_association_t *asoc;
struct sk_buff_head reasm;
struct sk_buff_head lobby;
__u16 ssn[0];
} sctp_ulpqueue_t;
/* This macro assists in creation of external storage for variable length
* internal buffers.
*/
#define sctp_ulpqueue_storage_size(inbound) (sizeof(__u16) * (inbound))
sctp_ulpqueue_t *sctp_ulpqueue_new(sctp_association_t *asoc,
__u16 inbound,
int priority);
sctp_ulpqueue_t *sctp_ulpqueue_init(sctp_ulpqueue_t *ulpq,
sctp_association_t *asoc,
__u16 inbound);
void sctp_ulpqueue_free(sctp_ulpqueue_t *);
/* Add a new DATA chunk for processing. */
int sctp_ulpqueue_tail_data(sctp_ulpqueue_t *,
sctp_chunk_t *chunk,
int priority);
/* Add a new event for propogation to the ULP. */
int sctp_ulpqueue_tail_event(sctp_ulpqueue_t *,
sctp_ulpevent_t *event);
/* Is the ulpqueue empty. */
int sctp_ulpqueue_is_empty(sctp_ulpqueue_t *);
int sctp_ulpqueue_is_data_empty(sctp_ulpqueue_t *);
#endif /* __sctp_ulpqueue_h__ */
This diff is collapsed.
...@@ -130,7 +130,7 @@ struct sock { ...@@ -130,7 +130,7 @@ struct sock {
bsdism; bsdism;
unsigned char debug; unsigned char debug;
unsigned char rcvtstamp; unsigned char rcvtstamp;
/* Hole of 1 byte. Try to pack. */ unsigned char no_largesend;
int route_caps; int route_caps;
int proc; int proc;
unsigned long lingertime; unsigned long lingertime;
......
...@@ -905,13 +905,18 @@ static inline void tcp_reset_xmit_timer(struct sock *sk, int what, unsigned long ...@@ -905,13 +905,18 @@ static inline void tcp_reset_xmit_timer(struct sock *sk, int what, unsigned long
/* Compute the current effective MSS, taking SACKs and IP options, /* Compute the current effective MSS, taking SACKs and IP options,
* and even PMTU discovery events into account. * and even PMTU discovery events into account.
*
* LARGESEND note: !urg_mode is overkill, only frames up to snd_up
* cannot be large. However, taking into account rare use of URG, this
* is not a big flaw.
*/ */
static __inline__ unsigned int tcp_current_mss(struct sock *sk) static __inline__ unsigned int tcp_current_mss(struct sock *sk, int large)
{ {
struct tcp_opt *tp = tcp_sk(sk); struct tcp_opt *tp = tcp_sk(sk);
struct dst_entry *dst = __sk_dst_get(sk); struct dst_entry *dst = __sk_dst_get(sk);
int mss_now = tp->mss_cache; int mss_now = large && (sk->route_caps&NETIF_F_TSO) && !tp->urg_mode ?
tp->mss_cache : tp->mss_cache_std;
if (dst && dst->pmtu != tp->pmtu_cookie) if (dst && dst->pmtu != tp->pmtu_cookie)
mss_now = tcp_sync_mss(sk, dst->pmtu); mss_now = tcp_sync_mss(sk, dst->pmtu);
...@@ -933,7 +938,7 @@ static __inline__ unsigned int tcp_current_mss(struct sock *sk) ...@@ -933,7 +938,7 @@ static __inline__ unsigned int tcp_current_mss(struct sock *sk)
static inline void tcp_initialize_rcv_mss(struct sock *sk) static inline void tcp_initialize_rcv_mss(struct sock *sk)
{ {
struct tcp_opt *tp = tcp_sk(sk); struct tcp_opt *tp = tcp_sk(sk);
unsigned int hint = min(tp->advmss, tp->mss_cache); unsigned int hint = min(tp->advmss, tp->mss_cache_std);
hint = min(hint, tp->rcv_wnd/2); hint = min(hint, tp->rcv_wnd/2);
hint = min(hint, TCP_MIN_RCVMSS); hint = min(hint, TCP_MIN_RCVMSS);
...@@ -1269,7 +1274,7 @@ static __inline__ void __tcp_push_pending_frames(struct sock *sk, ...@@ -1269,7 +1274,7 @@ static __inline__ void __tcp_push_pending_frames(struct sock *sk,
static __inline__ void tcp_push_pending_frames(struct sock *sk, static __inline__ void tcp_push_pending_frames(struct sock *sk,
struct tcp_opt *tp) struct tcp_opt *tp)
{ {
__tcp_push_pending_frames(sk, tp, tcp_current_mss(sk), tp->nonagle); __tcp_push_pending_frames(sk, tp, tcp_current_mss(sk, 1), tp->nonagle);
} }
static __inline__ int tcp_may_send_now(struct sock *sk, struct tcp_opt *tp) static __inline__ int tcp_may_send_now(struct sock *sk, struct tcp_opt *tp)
...@@ -1277,7 +1282,7 @@ static __inline__ int tcp_may_send_now(struct sock *sk, struct tcp_opt *tp) ...@@ -1277,7 +1282,7 @@ static __inline__ int tcp_may_send_now(struct sock *sk, struct tcp_opt *tp)
struct sk_buff *skb = tp->send_head; struct sk_buff *skb = tp->send_head;
return (skb && return (skb &&
tcp_snd_test(tp, skb, tcp_current_mss(sk), tcp_snd_test(tp, skb, tcp_current_mss(sk, 1),
tcp_skb_is_last(sk, skb) ? 1 : tp->nonagle)); tcp_skb_is_last(sk, skb) ? 1 : tp->nonagle));
} }
...@@ -1839,6 +1844,15 @@ static inline int tcp_paws_check(struct tcp_opt *tp, int rst) ...@@ -1839,6 +1844,15 @@ static inline int tcp_paws_check(struct tcp_opt *tp, int rst)
return 1; return 1;
} }
static inline void tcp_v4_setup_caps(struct sock *sk, struct dst_entry *dst)
{
sk->route_caps = dst->dev->features;
if (sk->route_caps & NETIF_F_TSO) {
if (sk->no_largesend)
sk->route_caps &= ~NETIF_F_TSO;
}
}
#define TCP_CHECK_TIMER(sk) do { } while (0) #define TCP_CHECK_TIMER(sk) do { } while (0)
#endif /* _TCP_H */ #endif /* _TCP_H */
...@@ -28,12 +28,13 @@ TCP_ECN_send_synack(struct tcp_opt *tp, struct sk_buff *skb) ...@@ -28,12 +28,13 @@ TCP_ECN_send_synack(struct tcp_opt *tp, struct sk_buff *skb)
} }
static __inline__ void static __inline__ void
TCP_ECN_send_syn(struct tcp_opt *tp, struct sk_buff *skb) TCP_ECN_send_syn(struct sock *sk, struct tcp_opt *tp, struct sk_buff *skb)
{ {
tp->ecn_flags = 0; tp->ecn_flags = 0;
if (sysctl_tcp_ecn) { if (sysctl_tcp_ecn && !(sk->route_caps&NETIF_F_TSO)) {
TCP_SKB_CB(skb)->flags |= TCPCB_FLAG_ECE|TCPCB_FLAG_CWR; TCP_SKB_CB(skb)->flags |= TCPCB_FLAG_ECE|TCPCB_FLAG_CWR;
tp->ecn_flags = TCP_ECN_OK; tp->ecn_flags = TCP_ECN_OK;
sk->no_largesend = 1;
} }
} }
......
...@@ -85,8 +85,6 @@ struct sbus_mmap_map { ...@@ -85,8 +85,6 @@ struct sbus_mmap_map {
struct fb_info_sbusfb { struct fb_info_sbusfb {
struct fb_info info; struct fb_info info;
struct fb_fix_screeninfo fix;
struct fb_var_screeninfo var;
struct display disp; struct display disp;
struct display_switch dispsw; struct display_switch dispsw;
struct fbtype type; struct fbtype type;
......
...@@ -26,6 +26,9 @@ if [ "$CONFIG_INET" = "y" ]; then ...@@ -26,6 +26,9 @@ if [ "$CONFIG_INET" = "y" ]; then
source net/ipv6/Config.in source net/ipv6/Config.in
fi fi
fi fi
if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
source net/sctp/Config.in
fi
fi fi
if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
bool 'Asynchronous Transfer Mode (ATM) (EXPERIMENTAL)' CONFIG_ATM bool 'Asynchronous Transfer Mode (ATM) (EXPERIMENTAL)' CONFIG_ATM
......
...@@ -35,6 +35,7 @@ obj-$(CONFIG_DECNET) += decnet/ ...@@ -35,6 +35,7 @@ obj-$(CONFIG_DECNET) += decnet/
obj-$(CONFIG_ECONET) += econet/ obj-$(CONFIG_ECONET) += econet/
obj-$(CONFIG_VLAN_8021Q) += 8021q/ obj-$(CONFIG_VLAN_8021Q) += 8021q/
obj-$(CONFIG_LLC) += llc/ obj-$(CONFIG_LLC) += llc/
obj-$(CONFIG_IP_SCTP) += sctp/
ifeq ($(CONFIG_NET),y) ifeq ($(CONFIG_NET),y)
obj-$(CONFIG_MODULES) += netsyms.o obj-$(CONFIG_MODULES) += netsyms.o
......
...@@ -209,6 +209,8 @@ struct sk_buff *alloc_skb(unsigned int size, int gfp_mask) ...@@ -209,6 +209,8 @@ struct sk_buff *alloc_skb(unsigned int size, int gfp_mask)
atomic_set(&skb->users, 1); atomic_set(&skb->users, 1);
atomic_set(&(skb_shinfo(skb)->dataref), 1); atomic_set(&(skb_shinfo(skb)->dataref), 1);
skb_shinfo(skb)->nr_frags = 0; skb_shinfo(skb)->nr_frags = 0;
skb_shinfo(skb)->tso_size = 0;
skb_shinfo(skb)->tso_segs = 0;
skb_shinfo(skb)->frag_list = NULL; skb_shinfo(skb)->frag_list = NULL;
out: out:
return skb; return skb;
...@@ -490,6 +492,7 @@ int skb_linearize(struct sk_buff *skb, int gfp_mask) ...@@ -490,6 +492,7 @@ int skb_linearize(struct sk_buff *skb, int gfp_mask)
unsigned int size; unsigned int size;
u8 *data; u8 *data;
long offset; long offset;
struct skb_shared_info *ninfo;
int headerlen = skb->data - skb->head; int headerlen = skb->data - skb->head;
int expand = (skb->tail + skb->data_len) - skb->end; int expand = (skb->tail + skb->data_len) - skb->end;
...@@ -509,6 +512,14 @@ int skb_linearize(struct sk_buff *skb, int gfp_mask) ...@@ -509,6 +512,14 @@ int skb_linearize(struct sk_buff *skb, int gfp_mask)
if (skb_copy_bits(skb, -headerlen, data, headerlen + skb->len)) if (skb_copy_bits(skb, -headerlen, data, headerlen + skb->len))
BUG(); BUG();
/* Set up shinfo */
ninfo = (struct skb_shared_info*)(data + size);
atomic_set(&ninfo->dataref, 1);
ninfo->tso_size = skb_shinfo(skb)->tso_size;
ninfo->tso_segs = skb_shinfo(skb)->tso_segs;
ninfo->nr_frags = 0;
ninfo->frag_list = NULL;
/* Offset between the two in bytes */ /* Offset between the two in bytes */
offset = data - skb->head; offset = data - skb->head;
...@@ -525,11 +536,6 @@ int skb_linearize(struct sk_buff *skb, int gfp_mask) ...@@ -525,11 +536,6 @@ int skb_linearize(struct sk_buff *skb, int gfp_mask)
skb->tail += offset; skb->tail += offset;
skb->data += offset; skb->data += offset;
/* Set up shinfo */
atomic_set(&(skb_shinfo(skb)->dataref), 1);
skb_shinfo(skb)->nr_frags = 0;
skb_shinfo(skb)->frag_list = NULL;
/* We are no longer a clone, even if we were. */ /* We are no longer a clone, even if we were. */
skb->cloned = 0; skb->cloned = 0;
...@@ -583,6 +589,8 @@ struct sk_buff *pskb_copy(struct sk_buff *skb, int gfp_mask) ...@@ -583,6 +589,8 @@ struct sk_buff *pskb_copy(struct sk_buff *skb, int gfp_mask)
} }
skb_shinfo(n)->nr_frags = i; skb_shinfo(n)->nr_frags = i;
} }
skb_shinfo(n)->tso_size = skb_shinfo(skb)->tso_size;
skb_shinfo(n)->tso_segs = skb_shinfo(skb)->tso_segs;
if (skb_shinfo(skb)->frag_list) { if (skb_shinfo(skb)->frag_list) {
skb_shinfo(n)->frag_list = skb_shinfo(skb)->frag_list; skb_shinfo(n)->frag_list = skb_shinfo(skb)->frag_list;
...@@ -694,6 +702,9 @@ struct sk_buff *skb_realloc_headroom(struct sk_buff *skb, unsigned int headroom) ...@@ -694,6 +702,9 @@ struct sk_buff *skb_realloc_headroom(struct sk_buff *skb, unsigned int headroom)
* *
* You must pass %GFP_ATOMIC as the allocation priority if this function * You must pass %GFP_ATOMIC as the allocation priority if this function
* is called from an interrupt. * is called from an interrupt.
*
* BUG ALERT: ip_summed is not copied. Why does this work? Is it used
* only by netfilter in the cases when checksum is recalculated? --ANK
*/ */
struct sk_buff *skb_copy_expand(const struct sk_buff *skb, struct sk_buff *skb_copy_expand(const struct sk_buff *skb,
int newheadroom, int newtailroom, int gfp_mask) int newheadroom, int newtailroom, int gfp_mask)
...@@ -716,6 +727,8 @@ struct sk_buff *skb_copy_expand(const struct sk_buff *skb, ...@@ -716,6 +727,8 @@ struct sk_buff *skb_copy_expand(const struct sk_buff *skb,
BUG(); BUG();
copy_skb_header(n, skb); copy_skb_header(n, skb);
skb_shinfo(n)->tso_size = skb_shinfo(skb)->tso_size;
skb_shinfo(n)->tso_segs = skb_shinfo(skb)->tso_segs;
return n; return n;
} }
......
...@@ -493,7 +493,7 @@ int inet_release(struct socket *sock) ...@@ -493,7 +493,7 @@ int inet_release(struct socket *sock)
/* It is off by default, see below. */ /* It is off by default, see below. */
int sysctl_ip_nonlocal_bind; int sysctl_ip_nonlocal_bind;
static int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
{ {
struct sockaddr_in *addr = (struct sockaddr_in *)uaddr; struct sockaddr_in *addr = (struct sockaddr_in *)uaddr;
struct sock *sk = sock->sk; struct sock *sk = sock->sk;
...@@ -729,7 +729,7 @@ int inet_accept(struct socket *sock, struct socket *newsock, int flags) ...@@ -729,7 +729,7 @@ int inet_accept(struct socket *sock, struct socket *newsock, int flags)
/* /*
* This does both peername and sockname. * This does both peername and sockname.
*/ */
static int inet_getname(struct socket *sock, struct sockaddr *uaddr, int inet_getname(struct socket *sock, struct sockaddr *uaddr,
int *uaddr_len, int peer) int *uaddr_len, int peer)
{ {
struct sock *sk = sock->sk; struct sock *sk = sock->sk;
...@@ -846,7 +846,7 @@ int inet_shutdown(struct socket *sock, int how) ...@@ -846,7 +846,7 @@ int inet_shutdown(struct socket *sock, int how)
* There's a good 20K of config code hanging around the kernel. * There's a good 20K of config code hanging around the kernel.
*/ */
static int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
{ {
struct sock *sk = sock->sk; struct sock *sk = sock->sk;
int err = 0; int err = 0;
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -786,6 +786,8 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct open_request *req, ...@@ -786,6 +786,8 @@ struct sock *tcp_create_openreq_child(struct sock *sk, struct open_request *req,
newtp->ack.last_seg_size = skb->len-newtp->tcp_header_len; newtp->ack.last_seg_size = skb->len-newtp->tcp_header_len;
newtp->mss_clamp = req->mss; newtp->mss_clamp = req->mss;
TCP_ECN_openreq_child(newtp, req); TCP_ECN_openreq_child(newtp, req);
if (newtp->ecn_flags&TCP_ECN_OK)
newsk->no_largesend = 1;
TCP_INC_STATS_BH(TcpPassiveOpens); TCP_INC_STATS_BH(TcpPassiveOpens);
} }
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment