|
@@ -44,7 +44,12 @@
|
|
* bit3 (0x08): "1" 3 cycle time, "0" 2 cycle time (?)
|
|
* bit3 (0x08): "1" 3 cycle time, "0" 2 cycle time (?)
|
|
*/
|
|
*/
|
|
#define HT_CONFIG_PORT 0x3e6
|
|
#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)
|
|
* FIFO + PREFETCH (both a/b-model)
|
|
*/
|
|
*/
|
|
@@ -90,7 +95,11 @@
|
|
* Active Time for each drive. Smaller value gives higher speed.
|
|
* Active Time for each drive. Smaller value gives higher speed.
|
|
* In case of failures you should probably fall back to a higher value.
|
|
* 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
|
|
#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)
|
|
static void ht_set_prefetch(ide_drive_t *drive, u8 state)
|
|
{
|
|
{
|
|
- unsigned long flags;
|
|
|
|
|
|
+ unsigned long flags, config;
|
|
int t = HT_PREFETCH_MODE << 8;
|
|
int t = HT_PREFETCH_MODE << 8;
|
|
|
|
|
|
spin_lock_irqsave(&ht6560b_lock, flags);
|
|
spin_lock_irqsave(&ht6560b_lock, flags);
|
|
|
|
|
|
|
|
+ config = (unsigned long)ide_get_drivedata(drive);
|
|
|
|
+
|
|
/*
|
|
/*
|
|
* Prefetch mode and unmask irq seems to conflict
|
|
* Prefetch mode and unmask irq seems to conflict
|
|
*/
|
|
*/
|
|
if (state) {
|
|
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_NO_UNMASK;
|
|
drive->dev_flags &= ~IDE_DFLAG_UNMASK;
|
|
drive->dev_flags &= ~IDE_DFLAG_UNMASK;
|
|
} else {
|
|
} else {
|
|
- drive->drive_data &= ~t; /* disable prefetch mode */
|
|
|
|
|
|
+ config &= ~t; /* disable prefetch mode */
|
|
drive->dev_flags &= ~IDE_DFLAG_NO_UNMASK;
|
|
drive->dev_flags &= ~IDE_DFLAG_NO_UNMASK;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ ide_set_drivedata(drive, (void *)config);
|
|
|
|
+
|
|
spin_unlock_irqrestore(&ht6560b_lock, flags);
|
|
spin_unlock_irqrestore(&ht6560b_lock, flags);
|
|
|
|
|
|
#ifdef DEBUG
|
|
#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)
|
|
static void ht6560b_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
|
{
|
|
{
|
|
- unsigned long flags;
|
|
|
|
|
|
+ unsigned long flags, config;
|
|
u8 timing;
|
|
u8 timing;
|
|
|
|
|
|
switch (pio) {
|
|
switch (pio) {
|
|
@@ -281,8 +294,10 @@ static void ht6560b_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
|
timing = ht_pio2timings(drive, pio);
|
|
timing = ht_pio2timings(drive, pio);
|
|
|
|
|
|
spin_lock_irqsave(&ht6560b_lock, flags);
|
|
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);
|
|
spin_unlock_irqrestore(&ht6560b_lock, flags);
|
|
|
|
|
|
#ifdef DEBUG
|
|
#ifdef DEBUG
|
|
@@ -299,7 +314,7 @@ static void __init ht6560b_init_dev(ide_drive_t *drive)
|
|
if (hwif->channel)
|
|
if (hwif->channel)
|
|
t |= (HT_SECONDARY_IF << 8);
|
|
t |= (HT_SECONDARY_IF << 8);
|
|
|
|
|
|
- drive->drive_data = t;
|
|
|
|
|
|
+ ide_set_drivedata(drive, (void *)t);
|
|
}
|
|
}
|
|
|
|
|
|
static int probe_ht6560b;
|
|
static int probe_ht6560b;
|