ide: do not access ide_drive_t 'drive_data' field directly
Change ide_drive_t 'drive_data' field from 'unsigned int' type to 'void *' type, allowing a wider range of values/types to be stored in this field. Added 'ide_get_drivedata' and 'ide_set_drivedata' helpers to get and set the 'drive_data' field. Fixed all host drivers to maintain coherency with the change in the 'drive_data' field type. Signed-off-by: Joao Ramos <joao.ramos@inov.pt> [bart: fix qd65xx build, cast to 'unsigned long', minor Coding Style fixups] Acked-by: Sergei Shtylyov <sshtylyov@ru.montavista.com> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
This commit is contained in:
committed by
Bartlomiej Zolnierkiewicz
parent
3779f818a4
commit
5bfb151f1f
@@ -44,7 +44,12 @@
|
||||
* bit3 (0x08): "1" 3 cycle time, "0" 2 cycle time (?)
|
||||
*/
|
||||
#define HT_CONFIG_PORT 0x3e6
|
||||
#define HT_CONFIG(drivea) (u8)(((drivea)->drive_data & 0xff00) >> 8)
|
||||
|
||||
static inline u8 HT_CONFIG(ide_drive_t *drive)
|
||||
{
|
||||
return ((unsigned long)ide_get_drivedata(drive) & 0xff00) >> 8;
|
||||
}
|
||||
|
||||
/*
|
||||
* FIFO + PREFETCH (both a/b-model)
|
||||
*/
|
||||
@@ -90,7 +95,11 @@
|
||||
* Active Time for each drive. Smaller value gives higher speed.
|
||||
* In case of failures you should probably fall back to a higher value.
|
||||
*/
|
||||
#define HT_TIMING(drivea) (u8)((drivea)->drive_data & 0x00ff)
|
||||
static inline u8 HT_TIMING(ide_drive_t *drive)
|
||||
{
|
||||
return (unsigned long)ide_get_drivedata(drive) & 0x00ff;
|
||||
}
|
||||
|
||||
#define HT_TIMING_DEFAULT 0xff
|
||||
|
||||
/*
|
||||
@@ -242,23 +251,27 @@ static DEFINE_SPINLOCK(ht6560b_lock);
|
||||
*/
|
||||
static void ht_set_prefetch(ide_drive_t *drive, u8 state)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned long flags, config;
|
||||
int t = HT_PREFETCH_MODE << 8;
|
||||
|
||||
spin_lock_irqsave(&ht6560b_lock, flags);
|
||||
|
||||
config = (unsigned long)ide_get_drivedata(drive);
|
||||
|
||||
/*
|
||||
* Prefetch mode and unmask irq seems to conflict
|
||||
*/
|
||||
if (state) {
|
||||
drive->drive_data |= t; /* enable prefetch mode */
|
||||
config |= t; /* enable prefetch mode */
|
||||
drive->dev_flags |= IDE_DFLAG_NO_UNMASK;
|
||||
drive->dev_flags &= ~IDE_DFLAG_UNMASK;
|
||||
} else {
|
||||
drive->drive_data &= ~t; /* disable prefetch mode */
|
||||
config &= ~t; /* disable prefetch mode */
|
||||
drive->dev_flags &= ~IDE_DFLAG_NO_UNMASK;
|
||||
}
|
||||
|
||||
ide_set_drivedata(drive, (void *)config);
|
||||
|
||||
spin_unlock_irqrestore(&ht6560b_lock, flags);
|
||||
|
||||
#ifdef DEBUG
|
||||
@@ -268,7 +281,7 @@ static void ht_set_prefetch(ide_drive_t *drive, u8 state)
|
||||
|
||||
static void ht6560b_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned long flags, config;
|
||||
u8 timing;
|
||||
|
||||
switch (pio) {
|
||||
@@ -281,8 +294,10 @@ static void ht6560b_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
||||
timing = ht_pio2timings(drive, pio);
|
||||
|
||||
spin_lock_irqsave(&ht6560b_lock, flags);
|
||||
drive->drive_data &= 0xff00;
|
||||
drive->drive_data |= timing;
|
||||
config = (unsigned long)ide_get_drivedata(drive);
|
||||
config &= 0xff00;
|
||||
config |= timing;
|
||||
ide_set_drivedata(drive, (void *)config);
|
||||
spin_unlock_irqrestore(&ht6560b_lock, flags);
|
||||
|
||||
#ifdef DEBUG
|
||||
@@ -299,7 +314,7 @@ static void __init ht6560b_init_dev(ide_drive_t *drive)
|
||||
if (hwif->channel)
|
||||
t |= (HT_SECONDARY_IF << 8);
|
||||
|
||||
drive->drive_data = t;
|
||||
ide_set_drivedata(drive, (void *)t);
|
||||
}
|
||||
|
||||
static int probe_ht6560b;
|
||||
|
Reference in New Issue
Block a user