[PATCH 6/9] block: xd: avoid some forward declarations
This moves the code around so that we can avoid a dozen forward-declarations, then move the few remaining ones above the table that use them. No semantic changes. Signed-off-by: Linus Walleij --- drivers/block/xd.c | 801 +++-- drivers/block/xd.h | 33 --- 2 files changed, 415 insertions(+), 419 deletions(-) diff --git a/drivers/block/xd.c b/drivers/block/xd.c index 9e00753..ffa6e76 100644 --- a/drivers/block/xd.c +++ b/drivers/block/xd.c @@ -121,6 +121,20 @@ static struct xd_info xd_info[XD_MAXDRIVES]; #define xd_dma_mem_free(addr, size) free_pages(addr, get_order(size)) static char *xd_dma_buffer; +/* card specific setup and geometry gathering code */ +static void xd_dtc_init_controller (unsigned int address); +static void xd_dtc5150cx_init_drive (u_char drive); +static void xd_dtc_init_drive (u_char drive); +static void xd_wd_init_controller (unsigned int address); +static void xd_wd_init_drive (u_char drive); +static void xd_seagate_init_controller (unsigned int address); +static void xd_seagate_init_drive (u_char drive); +static void xd_omti_init_controller (unsigned int address); +static void xd_omti_init_drive (u_char drive); +static void xd_xebec_init_controller (unsigned int address); +static void xd_xebec_init_drive (u_char drive); +static void xd_override_init_drive (u_char drive); + static struct xd_signature xd_sigs[] __initdata = { { 0x,"Override geometry handler",NULL,xd_override_init_drive,"n unknown" }, /* Pat Mackinlay, p...@it.com.au */ { 0x0008,"[BXD06 (C) DTC 17-MAY-1985]",xd_dtc_init_controller,xd_dtc5150cx_init_drive," DTC 5150CX" }, /* Andrzej Krzysztofowicz, an...@mif.pg.gda.pl */ @@ -150,13 +164,6 @@ static DEFINE_SPINLOCK(xd_lock); static struct gendisk *xd_gendisk[2]; -static int xd_getgeo(struct block_device *bdev, struct hd_geometry *geo); - -static const struct block_device_operations xd_fops = { - .owner = THIS_MODULE, - .ioctl = xd_ioctl, - .getgeo = xd_getgeo, -}; static DECLARE_WAIT_QUEUE_HEAD(xd_wait_int); static u_char xd_drives, xd_irq = 5, xd_dma = 3, xd_maxsectors; static u_char xd_override __initdata = 0, xd_type __initdata = 0; @@ -171,251 +178,206 @@ static bool nodma = XD_DONT_USE_DMA; static struct request_queue *xd_queue; -/* xd_init: register the block device number and set up pointer tables */ -static int __init xd_init(void) +/** + * xd_setup_dma() - set up the DMA controller for a data transfer + */ +static u_char xd_setup_dma(u_char mode, u_char *buffer, u_int count) { - u_char i,controller; - unsigned int address; - int err; + unsigned long f; -#ifdef MODULE - { - u_char count = 0; - for (i = 4; i > 0; i--) - if (((xd[i] = xd[i-1]) >= 0) && !count) - count = i; - if ((xd[0] = count)) - do_xd_setup(xd); + if (nodma) + return (PIO_MODE); + if (((unsigned long) buffer & 0x) != (((unsigned long) buffer + count) & 0x)) { +#ifdef DEBUG_OTHER + printk("xd_setup_dma: using PIO, transfer overlaps 64k boundary\n"); +#endif /* DEBUG_OTHER */ + return (PIO_MODE); } -#endif - init_timer (_watchdog_int); xd_watchdog_int.function = xd_watchdog; - - err = -EBUSY; - if (register_blkdev(XT_DISK_MAJOR, "xd")) - goto out1; + f=claim_dma_lock(); + disable_dma(xd_dma); + clear_dma_ff(xd_dma); + set_dma_mode(xd_dma,mode); + set_dma_addr(xd_dma, (unsigned long) buffer); + set_dma_count(xd_dma,count); - err = -ENOMEM; - xd_queue = blk_init_queue(do_xd_request, _lock); - if (!xd_queue) - goto out1a; + release_dma_lock(f); - if (xd_detect(,)) { + return (DMA_MODE); /* use DMA and INT */ +} - printk("Detected a%s controller (type %d) at address %06x\n", - xd_sigs[controller].name,controller,address); - if (!request_region(xd_iobase,4,"xd")) { - printk("xd: Ports at 0x%x are not available\n", - xd_iobase); - goto out2; - } - if (controller) - xd_sigs[controller].init_controller(address); - xd_drives = xd_initdrives(xd_sigs[controller].init_drive); +/** + * xd_build() - put stuff into an array in a format suitable for + * the controller + */ +static u_char *xd_build(u_char *cmdblk, u_char command, u_char drive, + u_char head, u_short cylinder, u_char sector, + u_char count, u_char control) +{ + cmdblk[0] = command; + cmdblk[1] = ((drive & 0x07) << 5) | (head & 0x1F); + cmdblk[2] = ((cylinder & 0x300) >> 2) | (sector & 0x3F); + cmdblk[3] = cylinder & 0xFF; + cmdblk[4]
[PATCH 6/9] block: xd: avoid some forward declarations
This moves the code around so that we can avoid a dozen forward-declarations, then move the few remaining ones above the table that use them. No semantic changes. Signed-off-by: Linus Walleij linus.wall...@linaro.org --- drivers/block/xd.c | 801 +++-- drivers/block/xd.h | 33 --- 2 files changed, 415 insertions(+), 419 deletions(-) diff --git a/drivers/block/xd.c b/drivers/block/xd.c index 9e00753..ffa6e76 100644 --- a/drivers/block/xd.c +++ b/drivers/block/xd.c @@ -121,6 +121,20 @@ static struct xd_info xd_info[XD_MAXDRIVES]; #define xd_dma_mem_free(addr, size) free_pages(addr, get_order(size)) static char *xd_dma_buffer; +/* card specific setup and geometry gathering code */ +static void xd_dtc_init_controller (unsigned int address); +static void xd_dtc5150cx_init_drive (u_char drive); +static void xd_dtc_init_drive (u_char drive); +static void xd_wd_init_controller (unsigned int address); +static void xd_wd_init_drive (u_char drive); +static void xd_seagate_init_controller (unsigned int address); +static void xd_seagate_init_drive (u_char drive); +static void xd_omti_init_controller (unsigned int address); +static void xd_omti_init_drive (u_char drive); +static void xd_xebec_init_controller (unsigned int address); +static void xd_xebec_init_drive (u_char drive); +static void xd_override_init_drive (u_char drive); + static struct xd_signature xd_sigs[] __initdata = { { 0x,Override geometry handler,NULL,xd_override_init_drive,n unknown }, /* Pat Mackinlay, p...@it.com.au */ { 0x0008,[BXD06 (C) DTC 17-MAY-1985],xd_dtc_init_controller,xd_dtc5150cx_init_drive, DTC 5150CX }, /* Andrzej Krzysztofowicz, an...@mif.pg.gda.pl */ @@ -150,13 +164,6 @@ static DEFINE_SPINLOCK(xd_lock); static struct gendisk *xd_gendisk[2]; -static int xd_getgeo(struct block_device *bdev, struct hd_geometry *geo); - -static const struct block_device_operations xd_fops = { - .owner = THIS_MODULE, - .ioctl = xd_ioctl, - .getgeo = xd_getgeo, -}; static DECLARE_WAIT_QUEUE_HEAD(xd_wait_int); static u_char xd_drives, xd_irq = 5, xd_dma = 3, xd_maxsectors; static u_char xd_override __initdata = 0, xd_type __initdata = 0; @@ -171,251 +178,206 @@ static bool nodma = XD_DONT_USE_DMA; static struct request_queue *xd_queue; -/* xd_init: register the block device number and set up pointer tables */ -static int __init xd_init(void) +/** + * xd_setup_dma() - set up the DMA controller for a data transfer + */ +static u_char xd_setup_dma(u_char mode, u_char *buffer, u_int count) { - u_char i,controller; - unsigned int address; - int err; + unsigned long f; -#ifdef MODULE - { - u_char count = 0; - for (i = 4; i 0; i--) - if (((xd[i] = xd[i-1]) = 0) !count) - count = i; - if ((xd[0] = count)) - do_xd_setup(xd); + if (nodma) + return (PIO_MODE); + if (((unsigned long) buffer 0x) != (((unsigned long) buffer + count) 0x)) { +#ifdef DEBUG_OTHER + printk(xd_setup_dma: using PIO, transfer overlaps 64k boundary\n); +#endif /* DEBUG_OTHER */ + return (PIO_MODE); } -#endif - init_timer (xd_watchdog_int); xd_watchdog_int.function = xd_watchdog; - - err = -EBUSY; - if (register_blkdev(XT_DISK_MAJOR, xd)) - goto out1; + f=claim_dma_lock(); + disable_dma(xd_dma); + clear_dma_ff(xd_dma); + set_dma_mode(xd_dma,mode); + set_dma_addr(xd_dma, (unsigned long) buffer); + set_dma_count(xd_dma,count); - err = -ENOMEM; - xd_queue = blk_init_queue(do_xd_request, xd_lock); - if (!xd_queue) - goto out1a; + release_dma_lock(f); - if (xd_detect(controller,address)) { + return (DMA_MODE); /* use DMA and INT */ +} - printk(Detected a%s controller (type %d) at address %06x\n, - xd_sigs[controller].name,controller,address); - if (!request_region(xd_iobase,4,xd)) { - printk(xd: Ports at 0x%x are not available\n, - xd_iobase); - goto out2; - } - if (controller) - xd_sigs[controller].init_controller(address); - xd_drives = xd_initdrives(xd_sigs[controller].init_drive); +/** + * xd_build() - put stuff into an array in a format suitable for + * the controller + */ +static u_char *xd_build(u_char *cmdblk, u_char command, u_char drive, + u_char head, u_short cylinder, u_char sector, + u_char count, u_char control) +{ + cmdblk[0] = command; + cmdblk[1] = ((drive 0x07) 5) | (head 0x1F); + cmdblk[2] = ((cylinder 0x300) 2) | (sector 0x3F); + cmdblk[3] = cylinder 0xFF; +