1#ifndef _BLK_H 2#define _BLK_H 3 4#include <linux/blkdev.h> 5#include <linux/locks.h> 6#include <linux/config.h> 7#include <linux/spinlock.h> 8 9/* 10 * Spinlock for protecting the request queue which 11 * is mucked around with in interrupts on potentially 12 * multiple CPU's.. 13 */ 14extern spinlock_t io_request_lock; 15 16/* 17 * Initialization functions. 18 */ 19extern int isp16_init(void); 20extern int cdu31a_init(void); 21extern int acsi_init(void); 22extern int mcd_init(void); 23extern int mcdx_init(void); 24extern int sbpcd_init(void); 25extern int aztcd_init(void); 26extern int sony535_init(void); 27extern int gscd_init(void); 28extern int cm206_init(void); 29extern int optcd_init(void); 30extern int sjcd_init(void); 31extern int cdi_init(void); 32extern int hd_init(void); 33extern int ide_init(void); 34extern int xd_init(void); 35extern int mfm_init(void); 36extern int loop_init(void); 37extern int md_init(void); 38extern int ap_init(void); 39extern int ddv_init(void); 40extern int z2_init(void); 41extern int swim3_init(void); 42extern int swimiop_init(void); 43extern int amiga_floppy_init(void); 44extern int atari_floppy_init(void); 45extern int nbd_init(void); 46extern int ez_init(void); 47extern int bpcd_init(void); 48extern int ps2esdi_init(void); 49extern int jsfd_init(void); 50 51#if defined(CONFIG_ARCH_S390) 52extern int mdisk_init(void); 53extern int dasd_init(void); 54#endif /* CONFIG_ARCH_S390 */ 55 56extern void set_device_ro(kdev_t dev,int flag); 57void add_blkdev_randomness(int major); 58 59extern int floppy_init(void); 60extern void rd_load(void); 61extern int rd_init(void); 62extern int rd_doload; /* 1 = load ramdisk, 0 = don't load */ 63extern int rd_prompt; /* 1 = prompt for ramdisk, 0 = don't prompt */ 64extern int rd_image_start; /* starting block # of image */ 65 66#ifdef CONFIG_BLK_DEV_INITRD 67 68#define INITRD_MINOR 250 /* shouldn't collide with /dev/ram* too soon ... */ 69 70extern unsigned long initrd_start,initrd_end; 71extern int mount_initrd; /* zero if initrd should not be mounted */ 72extern int initrd_below_start_ok; /* 1 if it is not an error if initrd_start < memory_start */ 73void initrd_init(void); 74 75#endif 76 77 78/* 79 * end_request() and friends. Must be called with the request queue spinlock 80 * acquired. All functions called within end_request() _must_be_ atomic. 81 * 82 * Several drivers define their own end_request and call 83 * end_that_request_first() and end_that_request_last() 84 * for parts of the original function. This prevents 85 * code duplication in drivers. 86 */ 87 88static inline void blkdev_dequeue_request(struct request * req) 89{ 90 if (req->e) { 91 req->e->dequeue_fn(req); 92 req->e = NULL; 93 } 94 list_del(&req->queue); 95} 96 97int end_that_request_first(struct request *req, int uptodate, char *name); 98void end_that_request_last(struct request *req); 99 100#if defined(MAJOR_NR) || defined(IDE_DRIVER) 101 102#undef DEVICE_ON 103#undef DEVICE_OFF 104 105/* 106 * Add entries as needed. 107 */ 108 109#ifdef IDE_DRIVER 110 111#define DEVICE_NR(device) (MINOR(device) >> PARTN_BITS) 112#define DEVICE_NAME "ide" 113 114#elif (MAJOR_NR == RAMDISK_MAJOR) 115 116/* ram disk */ 117#define DEVICE_NAME "ramdisk" 118#define DEVICE_NR(device) (MINOR(device)) 119#define DEVICE_NO_RANDOM 120 121#elif (MAJOR_NR == Z2RAM_MAJOR) 122 123/* Zorro II Ram */ 124#define DEVICE_NAME "Z2RAM" 125#define DEVICE_REQUEST do_z2_request 126#define DEVICE_NR(device) (MINOR(device)) 127 128#elif (MAJOR_NR == FLOPPY_MAJOR) 129 130static void floppy_off(unsigned int nr); 131 132#define DEVICE_NAME "floppy" 133#define DEVICE_INTR do_floppy 134#define DEVICE_REQUEST do_fd_request 135#define DEVICE_NR(device) ( (MINOR(device) & 3) | ((MINOR(device) & 0x80 ) >> 5 )) 136#define DEVICE_OFF(device) floppy_off(DEVICE_NR(device)) 137 138#elif (MAJOR_NR == HD_MAJOR) 139 140/* Hard disk: timeout is 6 seconds. */ 141#define DEVICE_NAME "hard disk" 142#define DEVICE_INTR do_hd 143#define TIMEOUT_VALUE (6*HZ) 144#define DEVICE_REQUEST do_hd_request 145#define DEVICE_NR(device) (MINOR(device)>>6) 146 147#elif (SCSI_DISK_MAJOR(MAJOR_NR)) 148 149#define DEVICE_NAME "scsidisk" 150#define TIMEOUT_VALUE (2*HZ) 151#define DEVICE_NR(device) (((MAJOR(device) & SD_MAJOR_MASK) << (8 - 4)) + (MINOR(device) >> 4)) 152 153/* Kludge to use the same number for both char and block major numbers */ 154#elif (MAJOR_NR == MD_MAJOR) && defined(MD_DRIVER) 155 156#define DEVICE_NAME "Multiple devices driver" 157#define DEVICE_REQUEST do_md_request 158#define DEVICE_NR(device) (MINOR(device)) 159 160#elif (MAJOR_NR == SCSI_TAPE_MAJOR) 161 162#define DEVICE_NAME "scsitape" 163#define DEVICE_INTR do_st 164#define DEVICE_NR(device) (MINOR(device) & 0x7f) 165 166#elif (MAJOR_NR == OSST_MAJOR) 167 168#define DEVICE_NAME "onstream" 169#define DEVICE_INTR do_osst 170#define DEVICE_NR(device) (MINOR(device) & 0x7f) 171#define DEVICE_ON(device) 172#define DEVICE_OFF(device) 173 174#elif (MAJOR_NR == SCSI_CDROM_MAJOR) 175 176#define DEVICE_NAME "CD-ROM" 177#define DEVICE_NR(device) (MINOR(device)) 178 179#elif (MAJOR_NR == XT_DISK_MAJOR) 180 181#define DEVICE_NAME "xt disk" 182#define DEVICE_REQUEST do_xd_request 183#define DEVICE_NR(device) (MINOR(device) >> 6) 184 185#elif (MAJOR_NR == PS2ESDI_MAJOR) 186 187#define DEVICE_NAME "PS/2 ESDI" 188#define DEVICE_REQUEST do_ps2esdi_request 189#define DEVICE_NR(device) (MINOR(device) >> 6) 190 191#elif (MAJOR_NR == CDU31A_CDROM_MAJOR) 192 193#define DEVICE_NAME "CDU31A" 194#define DEVICE_REQUEST do_cdu31a_request 195#define DEVICE_NR(device) (MINOR(device)) 196 197#elif (MAJOR_NR == ACSI_MAJOR) && (defined(CONFIG_ATARI_ACSI) || defined(CONFIG_ATARI_ACSI_MODULE)) 198 199#define DEVICE_NAME "ACSI" 200#define DEVICE_INTR do_acsi 201#define DEVICE_REQUEST do_acsi_request 202#define DEVICE_NR(device) (MINOR(device) >> 4) 203 204#elif (MAJOR_NR == MITSUMI_CDROM_MAJOR) 205 206#define DEVICE_NAME "Mitsumi CD-ROM" 207/* #define DEVICE_INTR do_mcd */ 208#define DEVICE_REQUEST do_mcd_request 209#define DEVICE_NR(device) (MINOR(device)) 210 211#elif (MAJOR_NR == MITSUMI_X_CDROM_MAJOR) 212 213#define DEVICE_NAME "Mitsumi CD-ROM" 214/* #define DEVICE_INTR do_mcdx */ 215#define DEVICE_REQUEST do_mcdx_request 216#define DEVICE_NR(device) (MINOR(device)) 217 218#elif (MAJOR_NR == MATSUSHITA_CDROM_MAJOR) 219 220#define DEVICE_NAME "Matsushita CD-ROM controller #1" 221#define DEVICE_REQUEST do_sbpcd_request 222#define DEVICE_NR(device) (MINOR(device)) 223 224#elif (MAJOR_NR == MATSUSHITA_CDROM2_MAJOR) 225 226#define DEVICE_NAME "Matsushita CD-ROM controller #2" 227#define DEVICE_REQUEST do_sbpcd2_request 228#define DEVICE_NR(device) (MINOR(device)) 229 230#elif (MAJOR_NR == MATSUSHITA_CDROM3_MAJOR) 231 232#define DEVICE_NAME "Matsushita CD-ROM controller #3" 233#define DEVICE_REQUEST do_sbpcd3_request 234#define DEVICE_NR(device) (MINOR(device)) 235 236#elif (MAJOR_NR == MATSUSHITA_CDROM4_MAJOR) 237 238#define DEVICE_NAME "Matsushita CD-ROM controller #4" 239#define DEVICE_REQUEST do_sbpcd4_request 240#define DEVICE_NR(device) (MINOR(device)) 241 242#elif (MAJOR_NR == AZTECH_CDROM_MAJOR) 243 244#define DEVICE_NAME "Aztech CD-ROM" 245#define DEVICE_REQUEST do_aztcd_request 246#define DEVICE_NR(device) (MINOR(device)) 247 248#elif (MAJOR_NR == CDU535_CDROM_MAJOR) 249 250#define DEVICE_NAME "SONY-CDU535" 251#define DEVICE_INTR do_cdu535 252#define DEVICE_REQUEST do_cdu535_request 253#define DEVICE_NR(device) (MINOR(device)) 254 255#elif (MAJOR_NR == GOLDSTAR_CDROM_MAJOR) 256 257#define DEVICE_NAME "Goldstar R420" 258#define DEVICE_REQUEST do_gscd_request 259#define DEVICE_NR(device) (MINOR(device)) 260 261#elif (MAJOR_NR == CM206_CDROM_MAJOR) 262#define DEVICE_NAME "Philips/LMS CD-ROM cm206" 263#define DEVICE_REQUEST do_cm206_request 264#define DEVICE_NR(device) (MINOR(device)) 265 266#elif (MAJOR_NR == OPTICS_CDROM_MAJOR) 267 268#define DEVICE_NAME "DOLPHIN 8000AT CD-ROM" 269#define DEVICE_REQUEST do_optcd_request 270#define DEVICE_NR(device) (MINOR(device)) 271 272#elif (MAJOR_NR == SANYO_CDROM_MAJOR) 273 274#define DEVICE_NAME "Sanyo H94A CD-ROM" 275#define DEVICE_REQUEST do_sjcd_request 276#define DEVICE_NR(device) (MINOR(device)) 277 278#elif (MAJOR_NR == APBLOCK_MAJOR) 279 280#define DEVICE_NAME "apblock" 281#define DEVICE_REQUEST ap_request 282#define DEVICE_NR(device) (MINOR(device)) 283 284#elif (MAJOR_NR == DDV_MAJOR) 285 286#define DEVICE_NAME "ddv" 287#define DEVICE_REQUEST ddv_request 288#define DEVICE_NR(device) (MINOR(device)>>PARTN_BITS) 289 290#elif (MAJOR_NR == MFM_ACORN_MAJOR) 291 292#define DEVICE_NAME "mfm disk" 293#define DEVICE_INTR do_mfm 294#define DEVICE_REQUEST do_mfm_request 295#define DEVICE_NR(device) (MINOR(device) >> 6) 296 297#elif (MAJOR_NR == NBD_MAJOR) 298 299#define DEVICE_NAME "nbd" 300#define DEVICE_REQUEST do_nbd_request 301#define DEVICE_NR(device) (MINOR(device)) 302 303#elif (MAJOR_NR == MDISK_MAJOR) 304 305#define DEVICE_NAME "mdisk" 306#define DEVICE_REQUEST mdisk_request 307#define DEVICE_NR(device) (MINOR(device)) 308 309#elif (MAJOR_NR == DASD_MAJOR) 310 311#define DEVICE_NAME "dasd" 312#define DEVICE_REQUEST do_dasd_request 313#define DEVICE_NR(device) (MINOR(device) >> PARTN_BITS) 314 315#elif (MAJOR_NR == I2O_MAJOR) 316 317#define DEVICE_NAME "I2O block" 318#define DEVICE_REQUEST i2ob_request 319#define DEVICE_NR(device) (MINOR(device)>>4) 320 321#elif (MAJOR_NR == COMPAQ_SMART2_MAJOR) 322 323#define DEVICE_NAME "ida" 324#define TIMEOUT_VALUE (25*HZ) 325#define DEVICE_REQUEST do_ida_request0 326#define DEVICE_NR(device) (MINOR(device) >> 4) 327 328#endif /* MAJOR_NR == whatever */ 329 330/* provide DEVICE_xxx defaults, if not explicitly defined 331 * above in the MAJOR_NR==xxx if-elif tree */ 332#ifndef DEVICE_ON 333#define DEVICE_ON(device) do {} while (0) 334#endif 335#ifndef DEVICE_OFF 336#define DEVICE_OFF(device) do {} while (0) 337#endif 338 339#if (MAJOR_NR != SCSI_TAPE_MAJOR) && (MAJOR_NR != OSST_MAJOR) 340#if !defined(IDE_DRIVER) 341 342#ifndef CURRENT 343#define CURRENT blkdev_entry_next_request(&blk_dev[MAJOR_NR].request_queue.queue_head) 344#endif 345#ifndef QUEUE_EMPTY 346#define QUEUE_EMPTY list_empty(&blk_dev[MAJOR_NR].request_queue.queue_head) 347#endif 348 349#ifndef DEVICE_NAME 350#define DEVICE_NAME "unknown" 351#endif 352 353#define CURRENT_DEV DEVICE_NR(CURRENT->rq_dev) 354 355#ifdef DEVICE_INTR 356static void (*DEVICE_INTR)(void) = NULL; 357#endif 358 359#define SET_INTR(x) (DEVICE_INTR = (x)) 360 361#ifdef DEVICE_REQUEST 362static void (DEVICE_REQUEST)(request_queue_t *); 363#endif 364 365#ifdef DEVICE_INTR 366#define CLEAR_INTR SET_INTR(NULL) 367#else 368#define CLEAR_INTR 369#endif 370 371#define INIT_REQUEST \ 372 if (QUEUE_EMPTY) {\ 373 CLEAR_INTR; \ 374 return; \ 375 } \ 376 if (MAJOR(CURRENT->rq_dev) != MAJOR_NR) \ 377 panic(DEVICE_NAME ": request list destroyed"); \ 378 if (CURRENT->bh) { \ 379 if (!buffer_locked(CURRENT->bh)) \ 380 panic(DEVICE_NAME ": block not locked"); \ 381 } 382 383#endif /* !defined(IDE_DRIVER) */ 384 385 386#ifndef LOCAL_END_REQUEST /* If we have our own end_request, we do not want to include this mess */ 387 388#if ! SCSI_BLK_MAJOR(MAJOR_NR) && (MAJOR_NR != COMPAQ_SMART2_MAJOR) 389 390static inline void end_request(int uptodate) { 391 struct request *req = CURRENT; 392 393 if (end_that_request_first(req, uptodate, DEVICE_NAME)) 394 return; 395 396#ifndef DEVICE_NO_RANDOM 397 add_blkdev_randomness(MAJOR(req->rq_dev)); 398#endif 399 DEVICE_OFF(req->rq_dev); 400 blkdev_dequeue_request(req); 401 end_that_request_last(req); 402} 403 404#endif /* ! SCSI_BLK_MAJOR(MAJOR_NR) */ 405#endif /* LOCAL_END_REQUEST */ 406 407#endif /* (MAJOR_NR != SCSI_TAPE_MAJOR) */ 408#endif /* defined(MAJOR_NR) || defined(IDE_DRIVER) */ 409 410#endif /* _BLK_H */ 411

