Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
7176b206
Commit
7176b206
authored
Nov 23, 2007
by
Linus Torvalds
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Import 2.3.12pre4
parent
77725b26
Changes
11
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
376 additions
and
264 deletions
+376
-264
arch/alpha/config.in
arch/alpha/config.in
+1
-1
arch/i386/kernel/process.c
arch/i386/kernel/process.c
+14
-35
drivers/usb/mouse.c
drivers/usb/mouse.c
+3
-3
drivers/usb/ohci-debug.c
drivers/usb/ohci-debug.c
+11
-0
drivers/usb/ohci.c
drivers/usb/ohci.c
+261
-184
drivers/usb/ohci.h
drivers/usb/ohci.h
+14
-6
drivers/usb/usb_scsi.c
drivers/usb/usb_scsi.c
+55
-20
fs/buffer.c
fs/buffer.c
+1
-1
fs/exec.c
fs/exec.c
+1
-1
include/asm-i386/desc.h
include/asm-i386/desc.h
+15
-4
include/asm-i386/mmu_context.h
include/asm-i386/mmu_context.h
+0
-9
No files found.
arch/alpha/config.in
View file @
7176b206
...
@@ -188,7 +188,7 @@ tristate 'Kernel support for a.out (ECOFF) binaries' CONFIG_BINFMT_AOUT
...
@@ -188,7 +188,7 @@ tristate 'Kernel support for a.out (ECOFF) binaries' CONFIG_BINFMT_AOUT
tristate 'Kernel support for ELF binaries' CONFIG_BINFMT_ELF
tristate 'Kernel support for ELF binaries' CONFIG_BINFMT_ELF
tristate 'Kernel support for MISC binaries' CONFIG_BINFMT_MISC
tristate 'Kernel support for MISC binaries' CONFIG_BINFMT_MISC
tristate 'Kernel support for Linux/Intel ELF binaries' CONFIG_BINFMT_EM86
tristate 'Kernel support for Linux/Intel ELF binaries' CONFIG_BINFMT_EM86
source drivers/parpor/Config.in
source drivers/parpor
t
/Config.in
endmenu
endmenu
source drivers/pnp/Config.in
source drivers/pnp/Config.in
...
...
arch/i386/kernel/process.c
View file @
7176b206
...
@@ -322,14 +322,9 @@ void machine_restart(char * __unused)
...
@@ -322,14 +322,9 @@ void machine_restart(char * __unused)
pg0
[
0
]
=
_PAGE_RW
|
_PAGE_PRESENT
;
pg0
[
0
]
=
_PAGE_RW
|
_PAGE_PRESENT
;
/*
/*
* Use `swapper_pg_dir' as our page directory. We bother with
* Use `swapper_pg_dir' as our page directory.
* `SET_PAGE_DIR' because although might be rebooting, but if we change
* the way we set root page dir in the future, then we wont break a
* seldom used feature ;)
*/
*/
current
->
mm
->
pgd
=
swapper_pg_dir
;
asm
volatile
(
"movl %0,%%cr3"
:
:
"r"
(
__pa
(
swapper_pg_dir
)));
current
->
active_mm
->
pgd
=
swapper_pg_dir
;
activate_context
();
/* Write 0x1234 to absolute memory location 0x472. The BIOS reads
/* Write 0x1234 to absolute memory location 0x472. The BIOS reads
this on booting to tell it to "Bypass memory test (also warm
this on booting to tell it to "Bypass memory test (also warm
...
@@ -490,16 +485,7 @@ void release_segments(struct mm_struct *mm)
...
@@ -490,16 +485,7 @@ void release_segments(struct mm_struct *mm)
*/
*/
if
(
ldt
)
{
if
(
ldt
)
{
mm
->
segments
=
NULL
;
mm
->
segments
=
NULL
;
/*
clear_LDT
();
* special case, when we release the LDT from under
* the running CPU. Other CPUs cannot possibly use
* this LDT as we were getting here through mmput() ...
*/
if
(
mm
==
current
->
mm
)
load_LDT
(
mm
);
/*
* Nobody anymore uses the LDT, we can free it:
*/
vfree
(
ldt
);
vfree
(
ldt
);
}
}
}
}
...
@@ -581,12 +567,8 @@ void release_thread(struct task_struct *dead_task)
...
@@ -581,12 +567,8 @@ void release_thread(struct task_struct *dead_task)
}
}
/*
/*
* If new_mm is NULL, we're being called to set up the LDT for
* a clone task: this is easy since the clone is not running yet.
* otherwise we copy the old segment into a new segment.
*
* we do not have to muck with descriptors here, that is
* we do not have to muck with descriptors here, that is
* done in
__switch_to() and get_mmu_context()
.
* done in
switch_mm() as needed
.
*/
*/
void
copy_segments
(
struct
task_struct
*
p
,
struct
mm_struct
*
new_mm
)
void
copy_segments
(
struct
task_struct
*
p
,
struct
mm_struct
*
new_mm
)
{
{
...
@@ -597,22 +579,19 @@ void copy_segments(struct task_struct *p, struct mm_struct *new_mm)
...
@@ -597,22 +579,19 @@ void copy_segments(struct task_struct *p, struct mm_struct *new_mm)
/*
/*
* default LDT - use the one from init_task
* default LDT - use the one from init_task
*/
*/
if
(
new_mm
)
new_mm
->
segments
=
NULL
;
new_mm
->
segments
=
NULL
;
return
;
return
;
}
}
if
(
new_mm
)
{
/*
/*
* Completely new LDT, we initialize it from the parent:
* Completely new LDT, we initialize it from the parent:
*/
*/
ldt
=
vmalloc
(
LDT_ENTRIES
*
LDT_ENTRY_SIZE
);
ldt
=
vmalloc
(
LDT_ENTRIES
*
LDT_ENTRY_SIZE
);
if
(
!
ldt
)
if
(
!
ldt
)
printk
(
KERN_WARNING
"ldt allocation failed
\n
"
);
printk
(
KERN_WARNING
"ldt allocation failed
\n
"
);
else
else
memcpy
(
ldt
,
old_ldt
,
LDT_ENTRIES
*
LDT_ENTRY_SIZE
);
memcpy
(
ldt
,
old_ldt
,
LDT_ENTRIES
*
LDT_ENTRY_SIZE
);
new_mm
->
segments
=
ldt
;
new_mm
->
segments
=
ldt
;
}
return
;
return
;
}
}
...
...
drivers/usb/mouse.c
View file @
7176b206
...
@@ -336,15 +336,15 @@ int usb_mouse_init(void)
...
@@ -336,15 +336,15 @@ int usb_mouse_init(void)
{
{
struct
mouse_state
*
mouse
=
&
static_mouse_state
;
struct
mouse_state
*
mouse
=
&
static_mouse_state
;
misc_register
(
&
usb_mouse
);
mouse
->
present
=
mouse
->
active
=
0
;
mouse
->
present
=
mouse
->
active
=
0
;
mouse
->
irq_handle
=
NULL
;
mouse
->
irq_handle
=
NULL
;
init_waitqueue_head
(
&
mouse
->
wait
);
init_waitqueue_head
(
&
mouse
->
wait
);
mouse
->
fasync
=
NULL
;
mouse
->
fasync
=
NULL
;
misc_register
(
&
usb_mouse
);
usb_register
(
&
mouse_driver
);
usb_register
(
&
mouse_driver
);
printk
(
KERN_INFO
"USB HID boot protocol mouse registered.
\n
"
);
printk
(
KERN_INFO
"USB HID boot protocol mouse
driver
registered.
\n
"
);
return
0
;
return
0
;
}
}
...
...
drivers/usb/ohci-debug.c
View file @
7176b206
...
@@ -131,7 +131,18 @@ void show_ohci_td(struct ohci_td *td)
...
@@ -131,7 +131,18 @@ void show_ohci_td(struct ohci_td *td)
printk
(
KERN_DEBUG
" next_td = 0x%x
\n
"
,
le32_to_cpup
(
&
td
->
next_td
));
printk
(
KERN_DEBUG
" next_td = 0x%x
\n
"
,
le32_to_cpup
(
&
td
->
next_td
));
printk
(
KERN_DEBUG
" buf_end = 0x%x
\n
"
,
le32_to_cpup
(
&
td
->
buf_end
));
printk
(
KERN_DEBUG
" buf_end = 0x%x
\n
"
,
le32_to_cpup
(
&
td
->
buf_end
));
printk
(
KERN_DEBUG
" ohci TD driver fields:
\n
"
);
printk
(
KERN_DEBUG
" ohci TD driver fields:
\n
"
);
printk
(
KERN_DEBUG
" flags = %x {"
,
td
->
hcd_flags
);
if
(
td_allocated
(
*
td
))
printk
(
" alloc"
);
if
(
td_dummy
(
*
td
))
printk
(
" dummy"
);
if
(
td_endofchain
(
*
td
))
printk
(
" endofchain"
);
if
(
!
can_auto_free
(
*
td
))
printk
(
" noautofree"
);
printk
(
"}
\n
"
);
printk
(
KERN_DEBUG
" data = %p
\n
"
,
td
->
data
);
printk
(
KERN_DEBUG
" data = %p
\n
"
,
td
->
data
);
printk
(
KERN_DEBUG
" cmpltd = %p
\n
"
,
td
->
completed
);
printk
(
KERN_DEBUG
" dev_id = %p
\n
"
,
td
->
dev_id
);
printk
(
KERN_DEBUG
" dev_id = %p
\n
"
,
td
->
dev_id
);
printk
(
KERN_DEBUG
" ed = %p
\n
"
,
td
->
ed
);
printk
(
KERN_DEBUG
" ed = %p
\n
"
,
td
->
ed
);
if
(
td
->
data
!=
NULL
)
{
if
(
td
->
data
!=
NULL
)
{
...
...
drivers/usb/ohci.c
View file @
7176b206
This diff is collapsed.
Click to expand it.
drivers/usb/ohci.h
View file @
7176b206
...
@@ -41,8 +41,7 @@ struct ohci_td {
...
@@ -41,8 +41,7 @@ struct ohci_td {
/* bit0: Is this TD allocated? */
/* bit0: Is this TD allocated? */
/* bit1: Is this a dummy (end of list) TD? */
/* bit1: Is this a dummy (end of list) TD? */
/* bit2: do NOT automatically free this TD on completion */
/* bit2: do NOT automatically free this TD on completion */
/* bit3: this is NOT the last TD in a contiguious TD chain
/* bit3: this is the last TD in a contiguious TD chain */
* on the indicated ED. (0 means it is the last) */
struct
usb_device
*
usb_dev
;
/* the owning device */
struct
usb_device
*
usb_dev
;
/* the owning device */
...
@@ -86,9 +85,9 @@ struct ohci_td {
...
@@ -86,9 +85,9 @@ struct ohci_td {
#define make_dumb_td(td) ((td)->hcd_flags |= 2)
#define make_dumb_td(td) ((td)->hcd_flags |= 2)
#define clear_dumb_td(td) ((td)->hcd_flags &= ~(__u32)2)
#define clear_dumb_td(td) ((td)->hcd_flags &= ~(__u32)2)
#define td_endofchain(td) (
!((td).hcd_flags & (1 << 3)
))
#define td_endofchain(td) (
(td).hcd_flags & (1 << 3
))
#define
set
_td_endofchain(td) ((td)->hcd_flags &= ~(1 << 3))
#define
clear
_td_endofchain(td) ((td)->hcd_flags &= ~(1 << 3))
#define
clear
_td_endofchain(td) ((td)->hcd_flags |= (1 << 3))
#define
set
_td_endofchain(td) ((td)->hcd_flags |= (1 << 3))
/*
/*
* These control if the IRQ will call ohci_free_td after taking the TDs
* These control if the IRQ will call ohci_free_td after taking the TDs
...
@@ -109,6 +108,10 @@ struct ohci_ed {
...
@@ -109,6 +108,10 @@ struct ohci_ed {
__u32
tail_td
;
/* TD Queue tail pointer */
__u32
tail_td
;
/* TD Queue tail pointer */
__u32
_head_td
;
/* TD Queue head pointer, toggle carry & halted bits */
__u32
_head_td
;
/* TD Queue head pointer, toggle carry & halted bits */
__u32
next_ed
;
/* Next ED */
__u32
next_ed
;
/* Next ED */
/* driver fields */
struct
ohci_device
*
ohci_dev
;
struct
ohci_ed
*
ed_chain
;
}
__attribute
((
aligned
(
16
)));
}
__attribute
((
aligned
(
16
)));
/* get the head_td */
/* get the head_td */
...
@@ -119,10 +122,13 @@ struct ohci_ed {
...
@@ -119,10 +122,13 @@ struct ohci_ed {
#define set_ed_head_td(ed, td) ((ed)->_head_td = cpu_to_le32((td)) \
#define set_ed_head_td(ed, td) ((ed)->_head_td = cpu_to_le32((td)) \
| ((ed)->_head_td & cpu_to_le32(3)))
| ((ed)->_head_td & cpu_to_le32(3)))
/* Control the ED's halted
flag
*/
/* Control the ED's halted
and carry flags
*/
#define ohci_halt_ed(ed) ((ed)->_head_td |= cpu_to_le32(1))
#define ohci_halt_ed(ed) ((ed)->_head_td |= cpu_to_le32(1))
#define ohci_unhalt_ed(ed) ((ed)->_head_td &= cpu_to_le32(~(__u32)1))
#define ohci_unhalt_ed(ed) ((ed)->_head_td &= cpu_to_le32(~(__u32)1))
#define ohci_ed_halted(ed) ((ed)->_head_td & cpu_to_le32(1))
#define ohci_ed_halted(ed) ((ed)->_head_td & cpu_to_le32(1))
#define ohci_ed_set_carry(ed) ((ed)->_head_td |= cpu_to_le32(2))
#define ohci_ed_clr_carry(ed) ((ed)->_head_td &= ~cpu_to_le32(2))
#define ohci_ed_carry(ed) ((le32_to_cpup(&(ed)->_head_td) >> 1) & 1)
#define OHCI_ED_SKIP (1 << 14)
#define OHCI_ED_SKIP (1 << 14)
#define OHCI_ED_MPS (0x7ff << 16)
#define OHCI_ED_MPS (0x7ff << 16)
...
@@ -142,6 +148,8 @@ struct ohci_ed {
...
@@ -142,6 +148,8 @@ struct ohci_ed {
#define OHCI_ED_EN (0xf << 7)
#define OHCI_ED_EN (0xf << 7)
#define OHCI_ED_FA (0x7f)
#define OHCI_ED_FA (0x7f)
#define ed_get_en(ed) ((le32_to_cpup(&(ed)->status) & OHCI_ED_EN) >> 7)
#define ed_get_fa(ed) (le32_to_cpup(&(ed)->status) & OHCI_ED_FA)
/* NOTE: bits 27-31 of the status dword are reserved for the HCD */
/* NOTE: bits 27-31 of the status dword are reserved for the HCD */
/*
/*
...
...
drivers/usb/usb_scsi.c
View file @
7176b206
...
@@ -139,10 +139,20 @@ static int us_one_transfer(struct us_data *us, int pipe, char *buf, int length)
...
@@ -139,10 +139,20 @@ static int us_one_transfer(struct us_data *us, int pipe, char *buf, int length)
this_xfer
=
length
>
max_size
?
max_size
:
length
;
this_xfer
=
length
>
max_size
?
max_size
:
length
;
length
-=
this_xfer
;
length
-=
this_xfer
;
do
{
do
{
US_DEBUGP
(
"Bulk xfer %x(%d)
\n
"
,
(
unsigned
int
)
buf
,
this_xfer
);
/*US_DEBUGP("Bulk xfer %x(%d)\n", (unsigned int)buf, this_xfer);*/
result
=
us
->
pusb_dev
->
bus
->
op
->
bulk_msg
(
us
->
pusb_dev
,
pipe
,
buf
,
result
=
us
->
pusb_dev
->
bus
->
op
->
bulk_msg
(
us
->
pusb_dev
,
pipe
,
buf
,
this_xfer
,
&
partial
);
this_xfer
,
&
partial
);
if
(
result
!=
0
||
partial
!=
this_xfer
)
US_DEBUGP
(
"bulk_msg returned %d xferred %lu/%d
\n
"
,
result
,
partial
,
this_xfer
);
if
(
result
==
USB_ST_STALL
)
{
US_DEBUGP
(
"clearing endpoing halt for pipe %x
\n
"
,
pipe
);
usb_clear_halt
(
us
->
pusb_dev
,
usb_pipeendpoint
(
pipe
)
|
(
pipe
&
0x80
));
}
/* we want to retry if the device reported NAK */
/* we want to retry if the device reported NAK */
if
(
result
==
USB_ST_TIMEOUT
)
{
if
(
result
==
USB_ST_TIMEOUT
)
{
if
(
partial
!=
this_xfer
)
{
if
(
partial
!=
this_xfer
)
{
...
@@ -171,28 +181,31 @@ static int us_one_transfer(struct us_data *us, int pipe, char *buf, int length)
...
@@ -171,28 +181,31 @@ static int us_one_transfer(struct us_data *us, int pipe, char *buf, int length)
return
0
;
return
0
;
}
}
static
int
us_transfer
(
Scsi_Cmnd
*
srb
,
int
dir_in
)
static
int
us_transfer
(
Scsi_Cmnd
*
srb
,
int
dir_in
)
{
{
struct
us_data
*
us
=
(
struct
us_data
*
)
srb
->
host_scribble
;
struct
us_data
*
us
=
(
struct
us_data
*
)
srb
->
host_scribble
;
int
i
;
int
i
;
int
result
=
-
1
;
int
result
=
-
1
;
unsigned
int
pipe
=
dir_in
?
usb_rcvbulkpipe
(
us
->
pusb_dev
,
us
->
ep_in
)
:
usb_sndbulkpipe
(
us
->
pusb_dev
,
us
->
ep_out
);
if
(
srb
->
use_sg
)
{
if
(
srb
->
use_sg
)
{
struct
scatterlist
*
sg
=
(
struct
scatterlist
*
)
srb
->
request_buffer
;
struct
scatterlist
*
sg
=
(
struct
scatterlist
*
)
srb
->
request_buffer
;
for
(
i
=
0
;
i
<
srb
->
use_sg
;
i
++
)
{
for
(
i
=
0
;
i
<
srb
->
use_sg
;
i
++
)
{
result
=
us_one_transfer
(
us
,
dir_in
?
usb_rcvbulkpipe
(
us
->
pusb_dev
,
us
->
ep_in
)
:
result
=
us_one_transfer
(
us
,
pipe
,
sg
[
i
].
address
,
sg
[
i
].
length
);
usb_sndbulkpipe
(
us
->
pusb_dev
,
us
->
ep_out
),
sg
[
i
].
address
,
sg
[
i
].
length
);
if
(
result
)
if
(
result
)
break
;
break
;
}
}
return
result
;
}
}
else
else
return
us_one_transfer
(
us
,
dir_in
?
usb_rcvbulkpipe
(
us
->
pusb_dev
,
us
->
ep_in
)
:
result
=
us_one_transfer
(
us
,
pipe
,
usb_sndbulkpipe
(
us
->
pusb_dev
,
us
->
ep_out
),
srb
->
request_buffer
,
srb
->
request_bufflen
);
srb
->
request_buffer
,
srb
->
request_bufflen
);
if
(
result
)
US_DEBUGP
(
"us_transfer returning error %d
\n
"
,
result
);
return
result
;
}
}
static
unsigned
int
us_transfer_length
(
Scsi_Cmnd
*
srb
)
static
unsigned
int
us_transfer_length
(
Scsi_Cmnd
*
srb
)
...
@@ -232,12 +245,13 @@ static int pop_CBI_irq(int state, void *buffer, int len, void *dev_id)
...
@@ -232,12 +245,13 @@ static int pop_CBI_irq(int state, void *buffer, int len, void *dev_id)
struct
us_data
*
us
=
(
struct
us_data
*
)
dev_id
;
struct
us_data
*
us
=
(
struct
us_data
*
)
dev_id
;
if
(
state
!=
USB_ST_REMOVED
)
{
if
(
state
!=
USB_ST_REMOVED
)
{
us
->
ip_data
=
*
(
__u16
*
)
buffer
;
us
->
ip_data
=
le16_to_cpup
((
__u16
*
)
buffer
)
;
US_DEBUGP
(
"Interrupt Status %x
\n
"
,
us
->
ip_data
);
/* US_DEBUGP("Interrupt Status %x\n", us->ip_data); */
}
}
if
(
us
->
ip_wanted
)
if
(
us
->
ip_wanted
)
{
us
->
ip_wanted
=
0
;
wake_up
(
&
us
->
ip_waitq
);
wake_up
(
&
us
->
ip_waitq
);
us
->
ip_wanted
=
0
;
}
/* we dont want another interrupt */
/* we dont want another interrupt */
...
@@ -250,6 +264,7 @@ static int pop_CB_reset(struct us_data *us)
...
@@ -250,6 +264,7 @@ static int pop_CB_reset(struct us_data *us)
devrequest
dr
;
devrequest
dr
;
int
result
;
int
result
;
US_DEBUGP
(
"pop_CB_reset
\n
"
);
dr
.
requesttype
=
USB_TYPE_CLASS
|
USB_RT_INTERFACE
;
dr
.
requesttype
=
USB_TYPE_CLASS
|
USB_RT_INTERFACE
;
dr
.
request
=
US_CBI_ADSC
;
dr
.
request
=
US_CBI_ADSC
;
dr
.
value
=
0
;
dr
.
value
=
0
;
...
@@ -262,12 +277,15 @@ static int pop_CB_reset(struct us_data *us)
...
@@ -262,12 +277,15 @@ static int pop_CB_reset(struct us_data *us)
usb_sndctrlpipe
(
us
->
pusb_dev
,
0
),
usb_sndctrlpipe
(
us
->
pusb_dev
,
0
),
&
dr
,
cmd
,
12
);
&
dr
,
cmd
,
12
);
usb_clear_halt
(
us
->
pusb_dev
,
us
->
ep_in
|
0x80
);
usb_clear_halt
(
us
->
pusb_dev
,
us
->
ep_out
);
/* long wait for reset */
/* long wait for reset */
schedule_timeout
(
HZ
*
5
);
schedule_timeout
(
HZ
*
5
);
US_DEBUGP
(
"pop_CB_reset: clearing endpoint halt
\n
"
);
usb_clear_halt
(
us
->
pusb_dev
,
us
->
ep_in
|
0x80
);
usb_clear_halt
(
us
->
pusb_dev
,
us
->
ep_out
);
US_DEBUGP
(
"pop_CB_reset done
\n
"
);
return
0
;
return
0
;
}
}
...
@@ -325,6 +343,7 @@ static int pop_CB_command(Scsi_Cmnd *srb)
...
@@ -325,6 +343,7 @@ static int pop_CB_command(Scsi_Cmnd *srb)
/* as per spec try a start command, wait and retry */
/* as per spec try a start command, wait and retry */
done_start
++
;
done_start
++
;
memset
(
cmd
,
0
,
sizeof
(
cmd
));
cmd
[
0
]
=
START_STOP
;
cmd
[
0
]
=
START_STOP
;
cmd
[
4
]
=
1
;
/* start */
cmd
[
4
]
=
1
;
/* start */
result
=
us
->
pusb_dev
->
bus
->
op
->
control_msg
(
us
->
pusb_dev
,
result
=
us
->
pusb_dev
->
bus
->
op
->
control_msg
(
us
->
pusb_dev
,
...
@@ -338,7 +357,7 @@ static int pop_CB_command(Scsi_Cmnd *srb)
...
@@ -338,7 +357,7 @@ static int pop_CB_command(Scsi_Cmnd *srb)
result
=
us
->
pusb_dev
->
bus
->
op
->
control_msg
(
us
->
pusb_dev
,
result
=
us
->
pusb_dev
->
bus
->
op
->
control_msg
(
us
->
pusb_dev
,
usb_sndctrlpipe
(
us
->
pusb_dev
,
0
),
usb_sndctrlpipe
(
us
->
pusb_dev
,
0
),
&
dr
,
srb
->
cmnd
,
srb
->
cmd_len
);
&
dr
,
srb
->
cmnd
,
srb
->
cmd_len
);
if
(
result
!=
USB_ST_STALL
&&
result
!=
USB_ST_TIMEOUT
)
if
(
/*result != USB_ST_STALL &&*/
result
!=
USB_ST_TIMEOUT
)
return
result
;
return
result
;
}
}
return
result
;
return
result
;
...
@@ -356,6 +375,7 @@ static int pop_CB_status(Scsi_Cmnd *srb)
...
@@ -356,6 +375,7 @@ static int pop_CB_status(Scsi_Cmnd *srb)
devrequest
dr
;
devrequest
dr
;
int
retry
=
5
;
int
retry
=
5
;
US_DEBUGP
(
"pop_CB_status, proto=%x
\n
"
,
us
->
protocol
);
switch
(
us
->
protocol
)
{
switch
(
us
->
protocol
)
{
case
US_PR_CB
:
case
US_PR_CB
:
/* get from control */
/* get from control */
...
@@ -439,23 +459,26 @@ static int pop_CBI(Scsi_Cmnd *srb)
...
@@ -439,23 +459,26 @@ static int pop_CBI(Scsi_Cmnd *srb)
if
(
result
==
USB_ST_STALL
||
result
==
USB_ST_TIMEOUT
)
{
if
(
result
==
USB_ST_STALL
||
result
==
USB_ST_TIMEOUT
)
{
return
(
DID_OK
<<
16
)
|
2
;
return
(
DID_OK
<<
16
)
|
2
;
}
}
return
DID_
ABORT
<<
16
;
return
DID_
ERROR
<<
16
;
}
}
/* transfer the data */
/* transfer the data */
if
(
us_transfer_length
(
srb
))
{
if
(
us_transfer_length
(
srb
))
{
result
=
us_transfer
(
srb
,
US_DIRECTION
(
srb
->
cmnd
[
0
]));
result
=
us_transfer
(
srb
,
US_DIRECTION
(
srb
->
cmnd
[
0
]));
if
(
result
&&
result
!=
USB_ST_DATAUNDERRUN
)
{
if
(
result
&&
result
!=
USB_ST_DATAUNDERRUN
&&
result
!=
USB_ST_STALL
)
{
US_DEBUGP
(
"CBI transfer %x
\n
"
,
result
);
US_DEBUGP
(
"CBI transfer %x
\n
"
,
result
);
return
DID_ABORT
<<
16
;
return
DID_ERROR
<<
16
;
}
else
if
(
result
==
USB_ST_DATAUNDERRUN
)
{
}
#if 0
else if (result == USB_ST_DATAUNDERRUN) {
return DID_OK << 16;
return DID_OK << 16;
}
}
} else {
} else {
if (!result) {
if (!result) {
return DID_OK << 16;
return DID_OK << 16;
}
}
#endif
}
}
/* get status */
/* get status */
...
@@ -947,6 +970,7 @@ static int usbscsi_control_thread(void * __us)
...
@@ -947,6 +970,7 @@ static int usbscsi_control_thread(void * __us)
US_DEBUGP
(
"Old/New length = %d/%d
\n
"
,
savelen
,
length
);
US_DEBUGP
(
"Old/New length = %d/%d
\n
"
,
savelen
,
length
);
if
(
us
->
srb
->
request_bufflen
!=
length
)
{
if
(
us
->
srb
->
request_bufflen
!=
length
)
{
US_DEBUGP
(
"redoing cmd with len=%d
\n
"
,
length
);
us
->
srb
->
request_bufflen
=
length
;
us
->
srb
->
request_bufflen
=
length
;
us
->
srb
->
result
=
us
->
pop
(
us
->
srb
);
us
->
srb
->
result
=
us
->
pop
(
us
->
srb
);
}
}
...
@@ -957,6 +981,15 @@ static int usbscsi_control_thread(void * __us)
...
@@ -957,6 +981,15 @@ static int usbscsi_control_thread(void * __us)
case
REQUEST_SENSE
:
case
REQUEST_SENSE
:
case
INQUIRY
:
case
INQUIRY
:
case
MODE_SENSE
:
case
MODE_SENSE
:
if
(
us
->
srb
->
use_sg
==
0
&&
length
>
0
)
{
int
i
;
printk
(
KERN_DEBUG
"Data is"
);
for
(
i
=
0
;
i
<
32
&&
i
<
length
;
++
i
)
printk
(
" %.2x"
,
((
unsigned
char
*
)
us
->
srb
->
request_buffer
)[
i
]);
if
(
i
<
length
)
printk
(
" ..."
);
printk
(
"
\n
"
);
}
us
->
srb
->
cmnd
[
4
]
=
saveallocation
;
us
->
srb
->
cmnd
[
4
]
=
saveallocation
;
break
;
break
;
...
@@ -969,6 +1002,7 @@ static int usbscsi_control_thread(void * __us)
...
@@ -969,6 +1002,7 @@ static int usbscsi_control_thread(void * __us)
}
}
/* force attention on first command */
/* force attention on first command */
if
(
!
us
->
attention_done
)
{
if
(
!
us
->
attention_done
)
{
US_DEBUGP
(
"forcing unit attention
\n
"
);
if
(
us
->
srb
->
cmnd
[
0
]
==
REQUEST_SENSE
)
{
if
(
us
->
srb
->
cmnd
[
0
]
==
REQUEST_SENSE
)
{
if
(
us
->
srb
->
result
==
(
DID_OK
<<
16
))
{
if
(
us
->
srb
->
result
==
(
DID_OK
<<
16
))
{
unsigned
char
*
p
=
(
unsigned
char
*
)
us
->
srb
->
request_buffer
;
unsigned
char
*
p
=
(
unsigned
char
*
)
us
->
srb
->
request_buffer
;
...
@@ -987,6 +1021,7 @@ static int usbscsi_control_thread(void * __us)
...
@@ -987,6 +1021,7 @@ static int usbscsi_control_thread(void * __us)
}
}
}
}
}
}
US_DEBUGP
(
"scsi cmd done, result=%x
\n
"
,
us
->
srb
->
result
);
us
->
srb
->
scsi_done
(
us
->
srb
);
us
->
srb
->
scsi_done
(
us
->
srb
);
us
->
srb
=
NULL
;
us
->
srb
=
NULL
;
break
;
break
;
...
...
fs/buffer.c
View file @
7176b206
...
@@ -1972,7 +1972,7 @@ void end_lazy_tlb(struct mm_struct *mm)
...
@@ -1972,7 +1972,7 @@ void end_lazy_tlb(struct mm_struct *mm)
current
->
mm
=
mm
;
current
->
mm
=
mm
;
if
(
mm
!=
active_mm
)
{
if
(
mm
!=
active_mm
)
{
current
->
active_mm
=
mm
;
current
->
active_mm
=
mm
;
activate_context
(
);
switch_mm
(
active_mm
,
mm
);
}
}
mmdrop
(
active_mm
);
mmdrop
(
active_mm
);
}
}
...
...
fs/exec.c
View file @
7176b206
...
@@ -384,7 +384,7 @@ static int exec_mmap(void)
...
@@ -384,7 +384,7 @@ static int exec_mmap(void)
mm
->
cpu_vm_mask
=
(
1UL
<<
smp_processor_id
());
mm
->
cpu_vm_mask
=
(
1UL
<<
smp_processor_id
());
current
->
mm
=
mm
;
current
->
mm
=
mm
;
current
->
active_mm
=
mm
;
current
->
active_mm
=
mm
;
activate_context
(
);
switch_mm
(
active_mm
,
mm
);
mm_release
();
mm_release
();
if
(
old_mm
)
{
if
(
old_mm
)
{
if
(
active_mm
!=
old_mm
)
BUG
();
if
(
active_mm
!=
old_mm
)
BUG
();
...
...
include/asm-i386/desc.h
View file @
7176b206
...
@@ -69,17 +69,28 @@ extern void set_intr_gate(unsigned int irq, void * addr);
...
@@ -69,17 +69,28 @@ extern void set_intr_gate(unsigned int irq, void * addr);
extern
void
set_ldt_desc
(
unsigned
int
n
,
void
*
addr
,
unsigned
int
size
);
extern
void
set_ldt_desc
(
unsigned
int
n
,
void
*
addr
,
unsigned
int
size
);
extern
void
set_tss_desc
(
unsigned
int
n
,
void
*
addr
);
extern
void
set_tss_desc
(
unsigned
int
n
,
void
*
addr
);
extern
inline
void
clear_LDT
(
void
)
{
int
cpu
=
smp_processor_id
();
set_ldt_desc
(
cpu
,
&
default_ldt
,
1
);
__load_LDT
(
cpu
);
}
/*
/*
* load one particular LDT into the current CPU
* load one particular LDT into the current CPU
*/
*/
extern
inline
void
load_LDT
(
struct
mm_struct
*
mm
)
extern
inline
void
load_LDT
(
struct
mm_struct
*
mm
)
{
{
int
cpu
=
smp_processor_id
();
int
cpu
=
smp_processor_id
();
void
*
segments
=
mm
->
segments
;
int
count
=
LDT_ENTRIES
;
if
(
mm
->
segments
)
if
(
!
segments
)
{
set_ldt_desc
(
cpu
,
mm
->
segments
,
LDT_ENTRIES
);
segments
=
&
default_ldt
;
else
count
=
1
;
set_ldt_desc
(
cpu
,
&
default_ldt
,
1
);
}
set_ldt_desc
(
cpu
,
segments
,
count
);
__load_LDT
(
cpu
);
__load_LDT
(
cpu
);
}
}
...
...
include/asm-i386/mmu_context.h
View file @
7176b206
...
@@ -9,15 +9,6 @@
...
@@ -9,15 +9,6 @@
#define destroy_context(mm) do { } while(0)
#define destroy_context(mm) do { } while(0)
#define init_new_context(tsk,mm) do { } while (0)
#define init_new_context(tsk,mm) do { } while (0)
static
inline
void
activate_context
(
void
)
{
struct
task_struct
*
tsk
=
current
;
struct
mm_struct
*
mm
=
tsk
->
mm
;
load_LDT
(
mm
);
__asm__
__volatile__
(
"movl %0,%%cr3"
:
:
"r"
(
__pa
(
mm
->
pgd
)));
}
static
inline
void
switch_mm
(
struct
mm_struct
*
prev
,
struct
mm_struct
*
next
)
static
inline
void
switch_mm
(
struct
mm_struct
*
prev
,
struct
mm_struct
*
next
)
{
{
/*
/*
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment