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
6250d3af
Commit
6250d3af
authored
Jun 07, 2009
by
Bartlomiej Zolnierkiewicz
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'for-linus' into for-next
parents
4c9773ed
075affcb
Changes
11
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
145 additions
and
43 deletions
+145
-43
Documentation/ide/ide.txt
Documentation/ide/ide.txt
+2
-0
Documentation/kernel-parameters.txt
Documentation/kernel-parameters.txt
+2
-5
drivers/ide/ide-disk.c
drivers/ide/ide-disk.c
+61
-10
drivers/ide/ide-gd.c
drivers/ide/ide-gd.c
+14
-0
drivers/ide/ide-pci-generic.c
drivers/ide/ide-pci-generic.c
+11
-0
drivers/ide/ide.c
drivers/ide/ide.c
+10
-0
drivers/ide/pdc202xx_old.c
drivers/ide/pdc202xx_old.c
+6
-16
fs/partitions/check.c
fs/partitions/check.c
+32
-10
include/linux/blkdev.h
include/linux/blkdev.h
+2
-0
include/linux/genhd.h
include/linux/genhd.h
+1
-0
include/linux/ide.h
include/linux/ide.h
+4
-2
No files found.
Documentation/ide/ide.txt
View file @
6250d3af
...
...
@@ -216,6 +216,8 @@ Other kernel parameters for ide_core are:
* "noflush=[interface_number.device_number]" to disable flush requests
* "nohpa=[interface_number.device_number]" to disable Host Protected Area
* "noprobe=[interface_number.device_number]" to skip probing
* "nowerr=[interface_number.device_number]" to ignore the WRERR_STAT bit
...
...
Documentation/kernel-parameters.txt
View file @
6250d3af
...
...
@@ -835,11 +835,8 @@ and is between 256 and 4096 characters. It is defined in the file
ide-core.nodma= [HW] (E)IDE subsystem
Format: =0.0 to prevent dma on hda, =0.1 hdb =1.0 hdc
.vlb_clock .pci_clock .noflush .noprobe .nowerr .cdrom
.chs .ignore_cable are additional options
See Documentation/ide/ide.txt.
idebus= [HW] (E)IDE subsystem - VLB/PCI bus speed
.vlb_clock .pci_clock .noflush .nohpa .noprobe .nowerr
.cdrom .chs .ignore_cable are additional options
See Documentation/ide/ide.txt.
ide-pci-generic.all-generic-ide [HW] (E)IDE subsystem
...
...
drivers/ide/ide-disk.c
View file @
6250d3af
...
...
@@ -302,14 +302,12 @@ static const struct drive_list_entry hpa_list[] = {
{
NULL
,
NULL
}
};
static
void
idedisk_check_hpa
(
ide_drive_t
*
drive
)
static
u64
ide_disk_hpa_get_native_capacity
(
ide_drive_t
*
drive
,
int
lba48
)
{
unsigned
long
long
capacity
,
set_max
;
int
lba48
=
ata_id_lba48_enabled
(
drive
->
id
);
u64
capacity
,
set_max
;
capacity
=
drive
->
capacity64
;
set_max
=
idedisk_read_native_max_address
(
drive
,
lba48
);
set_max
=
idedisk_read_native_max_address
(
drive
,
lba48
);
if
(
ide_in_drive_list
(
drive
->
id
,
hpa_list
))
{
/*
...
...
@@ -320,9 +318,31 @@ static void idedisk_check_hpa(ide_drive_t *drive)
set_max
--
;
}
return
set_max
;
}
static
u64
ide_disk_hpa_set_capacity
(
ide_drive_t
*
drive
,
u64
set_max
,
int
lba48
)
{
set_max
=
idedisk_set_max_address
(
drive
,
set_max
,
lba48
);
if
(
set_max
)
drive
->
capacity64
=
set_max
;
return
set_max
;
}
static
void
idedisk_check_hpa
(
ide_drive_t
*
drive
)
{
u64
capacity
,
set_max
;
int
lba48
=
ata_id_lba48_enabled
(
drive
->
id
);
capacity
=
drive
->
capacity64
;
set_max
=
ide_disk_hpa_get_native_capacity
(
drive
,
lba48
);
if
(
set_max
<=
capacity
)
return
;
drive
->
probed_capacity
=
set_max
;
printk
(
KERN_INFO
"%s: Host Protected Area detected.
\n
"
"
\t
current capacity is %llu sectors (%llu MB)
\n
"
"
\t
native capacity is %llu sectors (%llu MB)
\n
"
,
...
...
@@ -330,13 +350,13 @@ static void idedisk_check_hpa(ide_drive_t *drive)
capacity
,
sectors_to_MB
(
capacity
),
set_max
,
sectors_to_MB
(
set_max
));
set_max
=
idedisk_set_max_address
(
drive
,
set_max
,
lba48
);
if
((
drive
->
dev_flags
&
IDE_DFLAG_NOHPA
)
==
0
)
return
;
if
(
set_max
)
{
drive
->
capacity64
=
set_max
;
set_max
=
ide_disk_hpa_set_capacity
(
drive
,
set_max
,
lba48
);
if
(
set_max
)
printk
(
KERN_INFO
"%s: Host Protected Area disabled.
\n
"
,
drive
->
name
);
}
}
static
int
ide_disk_get_capacity
(
ide_drive_t
*
drive
)
...
...
@@ -358,6 +378,8 @@ static int ide_disk_get_capacity(ide_drive_t *drive)
drive
->
capacity64
=
drive
->
cyl
*
drive
->
head
*
drive
->
sect
;
}
drive
->
probed_capacity
=
drive
->
capacity64
;
if
(
lba
)
{
drive
->
dev_flags
|=
IDE_DFLAG_LBA
;
...
...
@@ -376,7 +398,7 @@ static int ide_disk_get_capacity(ide_drive_t *drive)
"%llu sectors (%llu MB)
\n
"
,
drive
->
name
,
(
unsigned
long
long
)
drive
->
capacity64
,
sectors_to_MB
(
drive
->
capacity64
));
drive
->
capacity64
=
1ULL
<<
28
;
drive
->
probed_capacity
=
drive
->
capacity64
=
1ULL
<<
28
;
}
if
((
drive
->
hwif
->
host_flags
&
IDE_HFLAG_NO_LBA48_DMA
)
&&
...
...
@@ -392,6 +414,34 @@ static int ide_disk_get_capacity(ide_drive_t *drive)
return
0
;
}
static
u64
ide_disk_set_capacity
(
ide_drive_t
*
drive
,
u64
capacity
)
{
u64
set
=
min
(
capacity
,
drive
->
probed_capacity
);
u16
*
id
=
drive
->
id
;
int
lba48
=
ata_id_lba48_enabled
(
id
);
if
((
drive
->
dev_flags
&
IDE_DFLAG_LBA
)
==
0
||
ata_id_hpa_enabled
(
id
)
==
0
)
goto
out
;
/*
* according to the spec the SET MAX ADDRESS command shall be
* immediately preceded by a READ NATIVE MAX ADDRESS command
*/
capacity
=
ide_disk_hpa_get_native_capacity
(
drive
,
lba48
);
if
(
capacity
==
0
)
goto
out
;
set
=
ide_disk_hpa_set_capacity
(
drive
,
set
,
lba48
);
if
(
set
)
{
/* needed for ->resume to disable HPA */
drive
->
dev_flags
|=
IDE_DFLAG_NOHPA
;
return
set
;
}
out:
return
drive
->
capacity64
;
}
static
void
idedisk_prepare_flush
(
struct
request_queue
*
q
,
struct
request
*
rq
)
{
ide_drive_t
*
drive
=
q
->
queuedata
;
...
...
@@ -740,6 +790,7 @@ static int ide_disk_set_doorlock(ide_drive_t *drive, struct gendisk *disk,
const
struct
ide_disk_ops
ide_ata_disk_ops
=
{
.
check
=
ide_disk_check
,
.
set_capacity
=
ide_disk_set_capacity
,
.
get_capacity
=
ide_disk_get_capacity
,
.
setup
=
ide_disk_setup
,
.
flush
=
ide_disk_flush
,
...
...
drivers/ide/ide-gd.c
View file @
6250d3af
...
...
@@ -287,6 +287,19 @@ static int ide_gd_media_changed(struct gendisk *disk)
return
ret
;
}
static
unsigned
long
long
ide_gd_set_capacity
(
struct
gendisk
*
disk
,
unsigned
long
long
capacity
)
{
struct
ide_disk_obj
*
idkp
=
ide_drv_g
(
disk
,
ide_disk_obj
);
ide_drive_t
*
drive
=
idkp
->
drive
;
const
struct
ide_disk_ops
*
disk_ops
=
drive
->
disk_ops
;
if
(
disk_ops
->
set_capacity
)
return
disk_ops
->
set_capacity
(
drive
,
capacity
);
return
drive
->
capacity64
;
}
static
int
ide_gd_revalidate_disk
(
struct
gendisk
*
disk
)
{
struct
ide_disk_obj
*
idkp
=
ide_drv_g
(
disk
,
ide_disk_obj
);
...
...
@@ -315,6 +328,7 @@ static struct block_device_operations ide_gd_ops = {
.
locked_ioctl
=
ide_gd_ioctl
,
.
getgeo
=
ide_gd_getgeo
,
.
media_changed
=
ide_gd_media_changed
,
.
set_capacity
=
ide_gd_set_capacity
,
.
revalidate_disk
=
ide_gd_revalidate_disk
};
...
...
drivers/ide/ide-pci-generic.c
View file @
6250d3af
...
...
@@ -33,6 +33,16 @@ static int ide_generic_all; /* Set to claim all devices */
module_param_named
(
all_generic_ide
,
ide_generic_all
,
bool
,
0444
);
MODULE_PARM_DESC
(
all_generic_ide
,
"IDE generic will claim all unknown PCI IDE storage controllers."
);
static
void
netcell_quirkproc
(
ide_drive_t
*
drive
)
{
/* mark words 85-87 as valid */
drive
->
id
[
ATA_ID_CSF_DEFAULT
]
|=
0x4000
;
}
static
const
struct
ide_port_ops
netcell_port_ops
=
{
.
quirkproc
=
netcell_quirkproc
,
};
#define DECLARE_GENERIC_PCI_DEV(extra_flags) \
{ \
.name = DRV_NAME, \
...
...
@@ -74,6 +84,7 @@ static const struct ide_port_info generic_chipsets[] __devinitdata = {
{
/* 6: Revolution */
.
name
=
DRV_NAME
,
.
port_ops
=
&
netcell_port_ops
,
.
host_flags
=
IDE_HFLAG_CLEAR_SIMPLEX
|
IDE_HFLAG_TRUST_BIOS_FOR_DMA
|
IDE_HFLAG_OFF_BOARD
,
...
...
drivers/ide/ide.c
View file @
6250d3af
...
...
@@ -211,6 +211,11 @@ static unsigned int ide_noflush;
module_param_call
(
noflush
,
ide_set_dev_param_mask
,
NULL
,
&
ide_noflush
,
0
);
MODULE_PARM_DESC
(
noflush
,
"disable flush requests for a device"
);
static
unsigned
int
ide_nohpa
;
module_param_call
(
nohpa
,
ide_set_dev_param_mask
,
NULL
,
&
ide_nohpa
,
0
);
MODULE_PARM_DESC
(
nohpa
,
"disable Host Protected Area for a device"
);
static
unsigned
int
ide_noprobe
;
module_param_call
(
noprobe
,
ide_set_dev_param_mask
,
NULL
,
&
ide_noprobe
,
0
);
...
...
@@ -281,6 +286,11 @@ static void ide_dev_apply_params(ide_drive_t *drive, u8 unit)
drive
->
name
);
drive
->
dev_flags
|=
IDE_DFLAG_NOFLUSH
;
}
if
(
ide_nohpa
&
(
1
<<
i
))
{
printk
(
KERN_INFO
"ide: disabling Host Protected Area for %s
\n
"
,
drive
->
name
);
drive
->
dev_flags
|=
IDE_DFLAG_NOHPA
;
}
if
(
ide_noprobe
&
(
1
<<
i
))
{
printk
(
KERN_INFO
"ide: skipping probe for %s
\n
"
,
drive
->
name
);
drive
->
dev_flags
|=
IDE_DFLAG_NOPROBE
;
...
...
drivers/ide/pdc202xx_old.c
View file @
6250d3af
/*
* Copyright (C) 1998-2002 Andre Hedrick <andre@linux-ide.org>
* Copyright (C) 2006-2007
MontaVista Software, Inc.
* Copyright (C) 2006-2007
, 2009
MontaVista Software, Inc.
* Copyright (C) 2007 Bartlomiej Zolnierkiewicz
*
* Portions Copyright (C) 1999 Promise Technology, Inc.
...
...
@@ -227,28 +227,19 @@ static int pdc202xx_dma_test_irq(ide_drive_t *drive)
return
(
dma_stat
&
4
)
==
4
;
/* return 1 if INTR asserted */
}
static
void
pdc202xx_reset
_host
(
ide_hwif_t
*
hwif
)
static
void
pdc202xx_reset
(
ide_drive_t
*
drive
)
{
ide_hwif_t
*
hwif
=
drive
->
hwif
;
unsigned
long
high_16
=
hwif
->
extra_base
-
16
;
u8
udma_speed_flag
=
inb
(
high_16
|
0x001f
);
printk
(
KERN_WARNING
"PDC202xx: software reset...
\n
"
);
outb
(
udma_speed_flag
|
0x10
,
high_16
|
0x001f
);
mdelay
(
100
);
outb
(
udma_speed_flag
&
~
0x10
,
high_16
|
0x001f
);
mdelay
(
2000
);
/* 2 seconds ?! */
printk
(
KERN_WARNING
"PDC202XX: %s channel reset.
\n
"
,
hwif
->
channel
?
"Secondary"
:
"Primary"
);
}
static
void
pdc202xx_reset
(
ide_drive_t
*
drive
)
{
ide_hwif_t
*
hwif
=
drive
->
hwif
;
ide_hwif_t
*
mate
=
hwif
->
mate
;
pdc202xx_reset_host
(
hwif
);
pdc202xx_reset_host
(
mate
);
ide_set_max_pio
(
drive
);
}
...
...
@@ -328,9 +319,8 @@ static const struct ide_dma_ops pdc20246_dma_ops = {
.
dma_start
=
ide_dma_start
,
.
dma_end
=
ide_dma_end
,
.
dma_test_irq
=
pdc202xx_dma_test_irq
,
.
dma_lost_irq
=
pdc202xx
_dma_lost_irq
,
.
dma_lost_irq
=
ide
_dma_lost_irq
,
.
dma_timer_expiry
=
ide_dma_sff_timer_expiry
,
.
dma_clear
=
pdc202xx_reset
,
.
dma_sff_read_status
=
ide_dma_sff_read_status
,
};
...
...
fs/partitions/check.c
View file @
6250d3af
...
...
@@ -546,27 +546,49 @@ int rescan_partitions(struct gendisk *disk, struct block_device *bdev)
/* add partitions */
for
(
p
=
1
;
p
<
state
->
limit
;
p
++
)
{
sector_t
size
=
state
->
parts
[
p
].
size
;
sector_t
from
=
state
->
parts
[
p
].
from
;
sector_t
size
,
from
;
try_scan:
size
=
state
->
parts
[
p
].
size
;
if
(
!
size
)
continue
;
from
=
state
->
parts
[
p
].
from
;
if
(
from
>=
get_capacity
(
disk
))
{
printk
(
KERN_WARNING
"%s: p%d ignored, start %llu is behind the end of the disk
\n
"
,
disk
->
disk_name
,
p
,
(
unsigned
long
long
)
from
);
continue
;
}
if
(
from
+
size
>
get_capacity
(
disk
))
{
/*
* we can not ignore partitions of broken tables
* created by for example camera firmware, but we
* limit them to the end of the disk to avoid
* creating invalid block devices
*/
struct
block_device_operations
*
bdops
=
disk
->
fops
;
unsigned
long
long
capacity
;
printk
(
KERN_WARNING
"%s: p%d size %llu
limited to end of disk
\n
"
,
"%s: p%d size %llu
exceeds device capacity,
"
,
disk
->
disk_name
,
p
,
(
unsigned
long
long
)
size
);
size
=
get_capacity
(
disk
)
-
from
;
if
(
bdops
->
set_capacity
&&
(
disk
->
flags
&
GENHD_FL_NATIVE_CAPACITY
)
==
0
)
{
printk
(
KERN_CONT
"enabling native capacity
\n
"
);
capacity
=
bdops
->
set_capacity
(
disk
,
~
0ULL
);
disk
->
flags
|=
GENHD_FL_NATIVE_CAPACITY
;
if
(
capacity
>
get_capacity
(
disk
))
{
set_capacity
(
disk
,
capacity
);
check_disk_size_change
(
disk
,
bdev
);
bdev
->
bd_invalidated
=
0
;
}
goto
try_scan
;
}
else
{
/*
* we can not ignore partitions of broken tables
* created by for example camera firmware, but
* we limit them to the end of the disk to avoid
* creating invalid block devices
*/
printk
(
KERN_CONT
"limited to end of disk
\n
"
);
size
=
get_capacity
(
disk
)
-
from
;
}
}
part
=
add_partition
(
disk
,
p
,
from
,
size
,
state
->
parts
[
p
].
flags
);
...
...
include/linux/blkdev.h
View file @
6250d3af
...
...
@@ -1106,6 +1106,8 @@ struct block_device_operations {
int
(
*
direct_access
)
(
struct
block_device
*
,
sector_t
,
void
**
,
unsigned
long
*
);
int
(
*
media_changed
)
(
struct
gendisk
*
);
unsigned
long
long
(
*
set_capacity
)
(
struct
gendisk
*
,
unsigned
long
long
);
int
(
*
revalidate_disk
)
(
struct
gendisk
*
);
int
(
*
getgeo
)(
struct
block_device
*
,
struct
hd_geometry
*
);
struct
module
*
owner
;
...
...
include/linux/genhd.h
View file @
6250d3af
...
...
@@ -113,6 +113,7 @@ struct hd_struct {
#define GENHD_FL_UP 16
#define GENHD_FL_SUPPRESS_PARTITION_INFO 32
#define GENHD_FL_EXT_DEVT 64
/* allow extended devt */
#define GENHD_FL_NATIVE_CAPACITY 128
#define BLK_SCSI_MAX_CMDS (256)
#define BLK_SCSI_CMD_PER_LONG (BLK_SCSI_MAX_CMDS / (sizeof(long) * 8))
...
...
include/linux/ide.h
View file @
6250d3af
...
...
@@ -381,6 +381,7 @@ struct ide_drive_s;
struct
ide_disk_ops
{
int
(
*
check
)(
struct
ide_drive_s
*
,
const
char
*
);
int
(
*
get_capacity
)(
struct
ide_drive_s
*
);
u64
(
*
set_capacity
)(
struct
ide_drive_s
*
,
u64
);
void
(
*
setup
)(
struct
ide_drive_s
*
);
void
(
*
flush
)(
struct
ide_drive_s
*
);
int
(
*
init_media
)(
struct
ide_drive_s
*
,
struct
gendisk
*
);
...
...
@@ -458,6 +459,8 @@ enum {
IDE_DFLAG_NICE1
=
(
1
<<
5
),
/* device is physically present */
IDE_DFLAG_PRESENT
=
(
1
<<
6
),
/* disable Host Protected Area */
IDE_DFLAG_NOHPA
=
(
1
<<
7
),
/* id read from device (synthetic if not set) */
IDE_DFLAG_ID_READ
=
(
1
<<
8
),
IDE_DFLAG_NOPROBE
=
(
1
<<
9
),
...
...
@@ -552,8 +555,7 @@ struct ide_drive_s {
unsigned
int
drive_data
;
/* used by set_pio_mode/dev_select() */
unsigned
int
failures
;
/* current failure count */
unsigned
int
max_failures
;
/* maximum allowed failure count */
u64
probed_capacity
;
/* initial reported media capacity (ide-cd only currently) */
u64
probed_capacity
;
/* initial/native media capacity */
u64
capacity64
;
/* total number of sectors */
int
lun
;
/* logical unit */
...
...
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