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

