Re: [PATCH 7/8] ide: add struct ide_port_info instances to legacy host drivers
On Sat, Feb 02, 2008 at 12:35:30AM +0100, Bartlomiej Zolnierkiewicz wrote: > > > Index: b/drivers/ide/arm/icside.c > > > === > > > --- a/drivers/ide/arm/icside.c > > > +++ b/drivers/ide/arm/icside.c > > > @@ -459,11 +456,19 @@ icside_register_v5(struct icside_state * > > > > > > idx[0] = hwif->index; > > > > > > - ide_device_add(idx); > > > + ide_device_add(idx, NULL); > > > > > > return 0; > > > } > > > > > > +static const struct ide_port_info icside_v6_port_info __initdata = { > > > + .host_flags = IDE_HFLAG_SERIALIZE | > > > + IDE_HFLAG_NO_DMA | /* no SFF-style DMA */ > > > + IDE_HFLAG_NO_AUTOTUNE, > > > + .mwdma_mask = ATA_MWDMA2, > > > + .swdma_mask = ATA_SWDMA2, > > > +}; > > > + > > > > Interesting... this driver's support for SWDMA0 is broken since the > > cycle > > should be 960 ns long, not 480, and SWDMA2 is underclocked using the same > > cycle as SWDMA1, 480 ns... > > Added Russell to Cc:. Underclocking the DMA is not a problem - if you look at the timing diagrams and associated tables in the ATA specifications, you'll find that they specify the *minimum* cycle timings. However, you're correct that SWDMA0 is not able to be supported. -- Russell King Linux kernel2.6 ARM Linux - http://www.arm.linux.org.uk/ maintainer of: - To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 7/8] ide: add struct ide_port_info instances to legacy host drivers
On Mon, 11 Feb 2008 00:16:07 +0100, Bartlomiej Zolnierkiewicz <[EMAIL PROTECTED]> wrote: > > It is too late for -git but not too late for 2.6.25-rc1. ;-) > > > > Could you make a patch please? > > I went ahead and made a patch (sorry, I needed it for git pull request :). > > From: Bartlomiej Zolnierkiewicz <[EMAIL PROTECTED]> > Subject: [PATCH] ide: ide_init_port() bugfix Thanks! Looks sane for me :) --- Atsushi Nemoto - To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 7/8] ide: add struct ide_port_info instances to legacy host drivers
On Sunday 10 February 2008, Bartlomiej Zolnierkiewicz wrote: > On Sunday 10 February 2008, Atsushi Nemoto wrote: > > On Sun, 06 Jan 2008 18:03:10 +0100, Bartlomiej Zolnierkiewicz <[EMAIL > > PROTECTED]> wrote: > > > + /* reset DMA masks only for SFF-style DMA controllers */ > > > + if ((d->host_flags && IDE_HFLAG_NO_DMA) == 0 && hwif->dma_base == 0) > > > + hwif->swdma_mask = hwif->mwdma_mask = hwif->ultra_mask = 0; > > > > It might be too late, but "host_flags && IDE_HFLAGS_NO_DMA" seems > > wrong for me. > > It is too late for -git but not too late for 2.6.25-rc1. ;-) > > Could you make a patch please? I went ahead and made a patch (sorry, I needed it for git pull request :). From: Bartlomiej Zolnierkiewicz <[EMAIL PROTECTED]> Subject: [PATCH] ide: ide_init_port() bugfix On Sunday 10 February 2008, Atsushi Nemoto wrote: > On Sun, 06 Jan 2008 18:03:10 +0100, Bartlomiej Zolnierkiewicz <[EMAIL > PROTECTED]> wrote: > > + /* reset DMA masks only for SFF-style DMA controllers */ > > + if ((d->host_flags && IDE_HFLAG_NO_DMA) == 0 && hwif->dma_base == 0) > > + hwif->swdma_mask = hwif->mwdma_mask = hwif->ultra_mask = 0; > > It might be too late, but "host_flags && IDE_HFLAGS_NO_DMA" seems > wrong for me. Fix regression caused by commmit c413b9b94d9a8e7548cc4b2e04b7df0439ce76fd ("ide: add struct ide_port_info instances to legacy host drivers"). Reported-by: Atsushi Nemoto <[EMAIL PROTECTED]> Signed-off-by: Bartlomiej Zolnierkiewicz <[EMAIL PROTECTED]> --- drivers/ide/ide-probe.c |2 +- 1 file changed, 1 insertion(+), 1 deletion(-) Index: b/drivers/ide/ide-probe.c === --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c @@ -1355,7 +1355,7 @@ static void ide_init_port(ide_hwif_t *hw hwif->ultra_mask = d->udma_mask; /* reset DMA masks only for SFF-style DMA controllers */ - if ((d->host_flags && IDE_HFLAG_NO_DMA) == 0 && hwif->dma_base == 0) + if ((d->host_flags & IDE_HFLAG_NO_DMA) == 0 && hwif->dma_base == 0) hwif->swdma_mask = hwif->mwdma_mask = hwif->ultra_mask = 0; if (d->host_flags & IDE_HFLAG_RQSIZE_256) - To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 7/8] ide: add struct ide_port_info instances to legacy host drivers
On Sunday 10 February 2008, Atsushi Nemoto wrote: > On Sun, 06 Jan 2008 18:03:10 +0100, Bartlomiej Zolnierkiewicz <[EMAIL > PROTECTED]> wrote: > > + /* reset DMA masks only for SFF-style DMA controllers */ > > + if ((d->host_flags && IDE_HFLAG_NO_DMA) == 0 && hwif->dma_base == 0) > > + hwif->swdma_mask = hwif->mwdma_mask = hwif->ultra_mask = 0; > > It might be too late, but "host_flags && IDE_HFLAGS_NO_DMA" seems > wrong for me. It is too late for -git but not too late for 2.6.25-rc1. ;-) Could you make a patch please? Thanks, Bart - To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 7/8] ide: add struct ide_port_info instances to legacy host drivers
On Sun, 06 Jan 2008 18:03:10 +0100, Bartlomiej Zolnierkiewicz <[EMAIL PROTECTED]> wrote: > + /* reset DMA masks only for SFF-style DMA controllers */ > + if ((d->host_flags && IDE_HFLAG_NO_DMA) == 0 && hwif->dma_base == 0) > + hwif->swdma_mask = hwif->mwdma_mask = hwif->ultra_mask = 0; It might be too late, but "host_flags && IDE_HFLAGS_NO_DMA" seems wrong for me. --- Atsushi Nemoto - To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 7/8] ide: add struct ide_port_info instances to legacy host drivers
Hi, On Monday 28 January 2008, Sergei Shtylyov wrote: > Hello. > > Bartlomiej Zolnierkiewicz wrote: > > > * Remove 'struct pci_dev *dev' argument from ide_hwif_setup_dma(). > > > * Un-static ide_hwif_setup_dma() and add CONFIG_BLK_DEV_IDEDMA_PCI=n > > version. > > > * Add 'const struct ide_port_info *d' argument to ide_device_add[_all](). > > > * Factor out generic ports init from ide_pci_setup_ports() to > > ide_init_port(), > > move it to ide-probe.c and call it in in ide_device_add_all() instead of > > ide_pci_setup_ports(). > > > * Move ->mate setup to ide_device_add_all() from ide_port_init(). > > > * Add IDE_HFLAG_NO_AUTOTUNE host flag for host drivers that don't enable > > ->autotune currently. > > > * Setup hwif->chipset in ide_init_port() but iff pi->chipset is set > > (to not override setup done by ide_hwif_configure()). > > > * Add ETRAX host handling to ide_device_add_all(). > > > * cmd640.c: set IDE_HFLAG_ABUSE_* also for CONFIG_BLK_DEV_CMD640_ENHANCED=n. > > > * pmac.c: make pmac_ide_setup_dma() return an error value and move DMA masks > > setup to pmac_ide_setup_device(). > > > * Add 'struct ide_port_info' instances to legacy host drivers, pass them to > > ide_device_add() calls and then remove open-coded ports initialization. > > > Signed-off-by: Bartlomiej Zolnierkiewicz <[EMAIL PROTECTED]> > > > Index: b/drivers/ide/arm/icside.c > > === > > --- a/drivers/ide/arm/icside.c > > +++ b/drivers/ide/arm/icside.c > > @@ -459,11 +456,19 @@ icside_register_v5(struct icside_state * > > > > idx[0] = hwif->index; > > > > - ide_device_add(idx); > > + ide_device_add(idx, NULL); > > > > return 0; > > } > > > > +static const struct ide_port_info icside_v6_port_info __initdata = { > > + .host_flags = IDE_HFLAG_SERIALIZE | > > + IDE_HFLAG_NO_DMA | /* no SFF-style DMA */ > > + IDE_HFLAG_NO_AUTOTUNE, > > + .mwdma_mask = ATA_MWDMA2, > > + .swdma_mask = ATA_SWDMA2, > > +}; > > + > > Interesting... this driver's support for SWDMA0 is broken since the cycle > should be 960 ns long, not 480, and SWDMA2 is underclocked using the same > cycle as SWDMA1, 480 ns... Added Russell to Cc:. > > Index: b/drivers/ide/cris/ide-cris.c > > === > > --- a/drivers/ide/cris/ide-cris.c > > +++ b/drivers/ide/cris/ide-cris.c > > @@ -753,6 +753,15 @@ static void cris_set_dma_mode(ide_drive_ > > cris_ide_set_speed(TYPE_DMA, 0, strobe, hold); > > } > > > > +static const struct ide_port_info cris_port_info __initdata = { > > + .chipset= ide_etrax100, > > + .host_flags = IDE_HFLAG_NO_ATAPI_DMA | > > + IDE_HFLAG_NO_DMA, /* no SFF-style DMA */ > > + .pio_mask = ATA_PIO4, > > + .udma_mask = cris_ultra_mask, > > Hm, I wonder which value it will assume, 0x07 or 0? Not sure even after > looking at the source... :-) This is tricky since it depends on the CRIS version (0x07 on CRIS V32 and 0x00 on CRIS V10). > > + .mwdma_mask = ATA_MWDMA2, > > +}; > > + > > static int __init init_e100_ide(void) > > { > > hw_regs_t hw; > > Index: b/drivers/ide/ide-probe.c > > === > > --- a/drivers/ide/ide-probe.c > > +++ b/drivers/ide/ide-probe.c > > @@ -1289,12 +1289,86 @@ static void hwif_register_devices(ide_hw > > } > > } > > > > -int ide_device_add_all(u8 *idx) > > +static void ide_init_port(ide_hwif_t *hwif, unsigned int port, > > + const struct ide_port_info *d) > > { > > - ide_hwif_t *hwif; > > + if (d->chipset != ide_etrax100) > > + hwif->channel = port; > >Hm, what's so special about ide_etrax100? The driver supports *4* channels and it didn't set ->channel at all. Since in the meantime ide-cris got marked as BROKEN I guess that a patch removing above code would be OK. > > +int ide_device_add_all(u8 idx[MAX_HWIFS], const struct ide_port_info *d) > > Function prototype doesn't match with one from which has > the > first argument as a pointer... I fixed it locally, thanks. > > +{ > > + ide_hwif_t *hwif, *mate = NULL; > > int i, rc = 0; > > > > for (i = 0; i < MAX_HWIFS; i++) { > > + if (d == NULL || idx[i] == 0xff) { > > Why check for (d == NULL) every time and not do it once and break from > the > loop or even do it before the loop? To save on some code lines and resulting code size (ide_device_add_all is not performance critical). Bart - To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html
Re: [PATCH 7/8] ide: add struct ide_port_info instances to legacy host drivers
Hello. Bartlomiej Zolnierkiewicz wrote: * Remove 'struct pci_dev *dev' argument from ide_hwif_setup_dma(). * Un-static ide_hwif_setup_dma() and add CONFIG_BLK_DEV_IDEDMA_PCI=n version. * Add 'const struct ide_port_info *d' argument to ide_device_add[_all](). * Factor out generic ports init from ide_pci_setup_ports() to ide_init_port(), move it to ide-probe.c and call it in in ide_device_add_all() instead of ide_pci_setup_ports(). * Move ->mate setup to ide_device_add_all() from ide_port_init(). * Add IDE_HFLAG_NO_AUTOTUNE host flag for host drivers that don't enable ->autotune currently. * Setup hwif->chipset in ide_init_port() but iff pi->chipset is set (to not override setup done by ide_hwif_configure()). * Add ETRAX host handling to ide_device_add_all(). * cmd640.c: set IDE_HFLAG_ABUSE_* also for CONFIG_BLK_DEV_CMD640_ENHANCED=n. * pmac.c: make pmac_ide_setup_dma() return an error value and move DMA masks setup to pmac_ide_setup_device(). * Add 'struct ide_port_info' instances to legacy host drivers, pass them to ide_device_add() calls and then remove open-coded ports initialization. Signed-off-by: Bartlomiej Zolnierkiewicz <[EMAIL PROTECTED]> Index: b/drivers/ide/arm/icside.c === --- a/drivers/ide/arm/icside.c +++ b/drivers/ide/arm/icside.c @@ -459,11 +456,19 @@ icside_register_v5(struct icside_state * idx[0] = hwif->index; - ide_device_add(idx); + ide_device_add(idx, NULL); return 0; } +static const struct ide_port_info icside_v6_port_info __initdata = { + .host_flags = IDE_HFLAG_SERIALIZE | + IDE_HFLAG_NO_DMA | /* no SFF-style DMA */ + IDE_HFLAG_NO_AUTOTUNE, + .mwdma_mask = ATA_MWDMA2, + .swdma_mask = ATA_SWDMA2, +}; + Interesting... this driver's support for SWDMA0 is broken since the cycle should be 960 ns long, not 480, and SWDMA2 is underclocked using the same cycle as SWDMA1, 480 ns... Index: b/drivers/ide/cris/ide-cris.c === --- a/drivers/ide/cris/ide-cris.c +++ b/drivers/ide/cris/ide-cris.c @@ -753,6 +753,15 @@ static void cris_set_dma_mode(ide_drive_ cris_ide_set_speed(TYPE_DMA, 0, strobe, hold); } +static const struct ide_port_info cris_port_info __initdata = { + .chipset= ide_etrax100, + .host_flags = IDE_HFLAG_NO_ATAPI_DMA | + IDE_HFLAG_NO_DMA, /* no SFF-style DMA */ + .pio_mask = ATA_PIO4, + .udma_mask = cris_ultra_mask, Hm, I wonder which value it will assume, 0x07 or 0? Not sure even after looking at the source... :-) + .mwdma_mask = ATA_MWDMA2, +}; + static int __init init_e100_ide(void) { hw_regs_t hw; Index: b/drivers/ide/ide-probe.c === --- a/drivers/ide/ide-probe.c +++ b/drivers/ide/ide-probe.c @@ -1289,12 +1289,86 @@ static void hwif_register_devices(ide_hw } } -int ide_device_add_all(u8 *idx) +static void ide_init_port(ide_hwif_t *hwif, unsigned int port, + const struct ide_port_info *d) { - ide_hwif_t *hwif; + if (d->chipset != ide_etrax100) + hwif->channel = port; Hm, what's so special about ide_etrax100? +int ide_device_add_all(u8 idx[MAX_HWIFS], const struct ide_port_info *d) Function prototype doesn't match with one from which has the first argument as a pointer... +{ + ide_hwif_t *hwif, *mate = NULL; int i, rc = 0; for (i = 0; i < MAX_HWIFS; i++) { + if (d == NULL || idx[i] == 0xff) { Why check for (d == NULL) every time and not do it once and break from the loop or even do it before the loop? + mate = NULL; + continue; + } + + hwif = &ide_hwifs[idx[i]]; + + if (d->chipset != ide_etrax100 && (i & 1) && mate) { + hwif->mate = mate; + mate->mate = hwif; + } + + mate = (i & 1) ? NULL : hwif; + + ide_init_port(hwif, i & 1, d); + } + + for (i = 0; i < MAX_HWIFS; i++) { if (idx[i] == 0xff) continue; MBR, Sergei - To unsubscribe from this list: send the line "unsubscribe linux-ide" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html