|
@@ -68,6 +68,7 @@ struct icside_state {
|
|
|
unsigned int enabled;
|
|
|
void __iomem *irq_port;
|
|
|
void __iomem *ioc_base;
|
|
|
+ unsigned int sel;
|
|
|
unsigned int type;
|
|
|
ide_hwif_t *hwif[2];
|
|
|
};
|
|
@@ -165,7 +166,8 @@ static const expansioncard_ops_t icside_ops_arcin_v6 = {
|
|
|
static void icside_maskproc(ide_drive_t *drive, int mask)
|
|
|
{
|
|
|
ide_hwif_t *hwif = HWIF(drive);
|
|
|
- struct icside_state *state = hwif->hwif_data;
|
|
|
+ struct expansion_card *ec = ECARD_DEV(hwif->dev);
|
|
|
+ struct icside_state *state = ecard_get_drvdata(ec);
|
|
|
unsigned long flags;
|
|
|
|
|
|
local_irq_save(flags);
|
|
@@ -308,6 +310,7 @@ static int icside_dma_setup(ide_drive_t *drive)
|
|
|
{
|
|
|
ide_hwif_t *hwif = HWIF(drive);
|
|
|
struct expansion_card *ec = ECARD_DEV(hwif->dev);
|
|
|
+ struct icside_state *state = ecard_get_drvdata(ec);
|
|
|
struct request *rq = hwif->hwgroup->rq;
|
|
|
unsigned int dma_mode;
|
|
|
|
|
@@ -331,7 +334,7 @@ static int icside_dma_setup(ide_drive_t *drive)
|
|
|
/*
|
|
|
* Route the DMA signals to the correct interface.
|
|
|
*/
|
|
|
- writeb(hwif->select_data, hwif->config_data);
|
|
|
+ writeb(state->sel | hwif->channel, state->ioc_base);
|
|
|
|
|
|
/*
|
|
|
* Select the correct timing for this drive.
|
|
@@ -359,7 +362,8 @@ static void icside_dma_exec_cmd(ide_drive_t *drive, u8 cmd)
|
|
|
static int icside_dma_test_irq(ide_drive_t *drive)
|
|
|
{
|
|
|
ide_hwif_t *hwif = HWIF(drive);
|
|
|
- struct icside_state *state = hwif->hwif_data;
|
|
|
+ struct expansion_card *ec = ECARD_DEV(hwif->dev);
|
|
|
+ struct icside_state *state = ecard_get_drvdata(ec);
|
|
|
|
|
|
return readb(state->irq_port +
|
|
|
(hwif->channel ?
|
|
@@ -472,6 +476,8 @@ icside_register_v5(struct icside_state *state, struct expansion_card *ec)
|
|
|
|
|
|
state->hwif[0] = hwif;
|
|
|
|
|
|
+ ecard_set_drvdata(ec, state);
|
|
|
+
|
|
|
idx[0] = hwif->index;
|
|
|
|
|
|
ide_device_add(idx, NULL);
|
|
@@ -525,6 +531,7 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec)
|
|
|
|
|
|
state->irq_port = easi_base;
|
|
|
state->ioc_base = ioc_base;
|
|
|
+ state->sel = sel;
|
|
|
|
|
|
/*
|
|
|
* Be on the safe side - disable interrupts
|
|
@@ -545,13 +552,7 @@ icside_register_v6(struct icside_state *state, struct expansion_card *ec)
|
|
|
state->hwif[0] = hwif;
|
|
|
state->hwif[1] = mate;
|
|
|
|
|
|
- hwif->hwif_data = state;
|
|
|
- hwif->config_data = (unsigned long)ioc_base;
|
|
|
- hwif->select_data = sel;
|
|
|
-
|
|
|
- mate->hwif_data = state;
|
|
|
- mate->config_data = (unsigned long)ioc_base;
|
|
|
- mate->select_data = sel | 1;
|
|
|
+ ecard_set_drvdata(ec, state);
|
|
|
|
|
|
if (ec->dma != NO_DMA && !request_dma(ec->dma, hwif->name)) {
|
|
|
d.init_dma = icside_dma_init;
|
|
@@ -627,10 +628,8 @@ icside_probe(struct expansion_card *ec, const struct ecard_id *id)
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- if (ret == 0) {
|
|
|
- ecard_set_drvdata(ec, state);
|
|
|
+ if (ret == 0)
|
|
|
goto out;
|
|
|
- }
|
|
|
|
|
|
kfree(state);
|
|
|
release:
|