4 #include <linux/blkdev.h> 5 #include <linux/locks.h> 6 #include <linux/config.h> 7 #include <linux/spinlock.h> 10 * Spinlock for protecting the request queue which 11 * is mucked around with in interrupts on potentially 14 extern spinlock_t io_request_lock
; 17 * NR_REQUEST is the number of entries in the request-queue. 18 * NOTE that writes may use only the low 2/3 of these: reads 21 #define NR_REQUEST 128 24 * This is used in the elevator algorithm. We don't prioritise reads 25 * over writes any more --- although reads are more time-critical than 26 * writes, by treating them equally we increase filesystem throughput. 27 * This turns out to give better overall performance. -- sct 29 #define IN_ORDER(s1,s2) \ 30 ((s1)->rq_dev < (s2)->rq_dev || (((s1)->rq_dev == (s2)->rq_dev && \ 31 (s1)->sector < (s2)->sector))) 34 * Initialization functions. 36 externintisp16_init(void); 37 externintcdu31a_init(void); 38 externintacsi_init(void); 39 externintmcd_init(void); 40 externintmcdx_init(void); 41 externintsbpcd_init(void); 42 externintaztcd_init(void); 43 externintsony535_init(void); 44 externintgscd_init(void); 45 externintcm206_init(void); 46 externintoptcd_init(void); 47 externintsjcd_init(void); 48 externintcdi_init(void); 49 externinthd_init(void); 50 externintide_init(void); 51 externintxd_init(void); 52 externintmfm_init(void); 53 externintloop_init(void); 54 externintmd_init(void); 55 externintap_init(void); 56 externintddv_init(void); 57 externintz2_init(void); 58 externintswim3_init(void); 59 externintswimiop_init(void); 60 externintamiga_floppy_init(void); 61 externintatari_floppy_init(void); 62 externintnbd_init(void); 63 externintez_init(void); 64 externintbpcd_init(void); 65 externintps2esdi_init(void); 67 externvoidset_device_ro(kdev_t dev
,int flag
); 68 voidadd_blkdev_randomness(int major
); 70 externintfloppy_init(void); 71 externvoidrd_load(void); 72 externintrd_init(void); 73 externint rd_doload
;/* 1 = load ramdisk, 0 = don't load */ 74 externint rd_prompt
;/* 1 = prompt for ramdisk, 0 = don't prompt */ 75 externint rd_image_start
;/* starting block # of image */ 77 #ifdef CONFIG_BLK_DEV_INITRD 79 #define INITRD_MINOR 250/* shouldn't collide with /dev/ram* too soon ... */ 81 externunsigned long initrd_start
,initrd_end
; 82 externint mount_initrd
;/* zero if initrd should not be mounted */ 83 externint initrd_below_start_ok
;/* 1 if it is not an error if initrd_start < memory_start */ 84 voidinitrd_init(void); 90 * end_request() and friends. Must be called with the request queue spinlock 91 * acquired. All functions called within end_request() _must_be_ atomic. 93 * Several drivers define their own end_request and call 94 * end_that_request_first() and end_that_request_last() 95 * for parts of the original function. This prevents 96 * code duplication in drivers. 99 intend_that_request_first(struct request
*req
,int uptodate
,char*name
); 100 voidend_that_request_last(struct request
*req
); 102 #if defined(MAJOR_NR) || defined(IDE_DRIVER) 105 * Add entries as needed. 110 #define DEVICE_NR(device) (MINOR(device) >> PARTN_BITS) 111 #define DEVICE_ON(device)/* nothing */ 112 #define DEVICE_OFF(device)/* nothing */ 113 #define DEVICE_NAME"ide" 115 #elif (MAJOR_NR == RAMDISK_MAJOR) 118 #define DEVICE_NAME"ramdisk" 119 #define DEVICE_REQUEST rd_request 120 #define DEVICE_NR(device) (MINOR(device)) 121 #define DEVICE_ON(device) 122 #define DEVICE_OFF(device) 123 #define DEVICE_NO_RANDOM 125 #elif (MAJOR_NR == Z2RAM_MAJOR) 128 #define DEVICE_NAME"Z2RAM" 129 #define DEVICE_REQUEST do_z2_request 130 #define DEVICE_NR(device) (MINOR(device)) 131 #define DEVICE_ON(device) 132 #define DEVICE_OFF(device) 134 #elif (MAJOR_NR == FLOPPY_MAJOR) 136 static voidfloppy_off(unsigned int nr
); 138 #define DEVICE_NAME"floppy" 139 #define DEVICE_INTR do_floppy 140 #define DEVICE_REQUEST do_fd_request 141 #define DEVICE_NR(device) ( (MINOR(device) & 3) | ((MINOR(device) & 0x80 ) >> 5 )) 142 #define DEVICE_ON(device) 143 #define DEVICE_OFF(device) floppy_off(DEVICE_NR(device)) 145 #elif (MAJOR_NR == HD_MAJOR) 147 /* Hard disk: timeout is 6 seconds. */ 148 #define DEVICE_NAME"hard disk" 149 #define DEVICE_INTR do_hd 150 #define DEVICE_TIMEOUT HD_TIMER 151 #define TIMEOUT_VALUE (6*HZ) 152 #define DEVICE_REQUEST do_hd_request 153 #define DEVICE_NR(device) (MINOR(device)>>6) 154 #define DEVICE_ON(device) 155 #define DEVICE_OFF(device) 157 #elif (SCSI_DISK_MAJOR(MAJOR_NR)) 159 #define DEVICE_NAME"scsidisk" 160 #define DEVICE_INTR do_sd 161 #define TIMEOUT_VALUE (2*HZ) 162 #define DEVICE_REQUEST do_sd_request 163 #define DEVICE_NR(device) (((MAJOR(device) & SD_MAJOR_MASK) << (8 - 4)) + (MINOR(device) >> 4)) 164 #define DEVICE_ON(device) 165 #define DEVICE_OFF(device) 167 /* Kludge to use the same number for both char and block major numbers */ 168 #elif (MAJOR_NR == MD_MAJOR) && defined(MD_DRIVER) 170 #define DEVICE_NAME"Multiple devices driver" 171 #define DEVICE_REQUEST do_md_request 172 #define DEVICE_NR(device) (MINOR(device)) 173 #define DEVICE_ON(device) 174 #define DEVICE_OFF(device) 176 #elif (MAJOR_NR == SCSI_TAPE_MAJOR) 178 #define DEVICE_NAME"scsitape" 179 #define DEVICE_INTR do_st 180 #define DEVICE_NR(device) (MINOR(device) & 0x7f) 181 #define DEVICE_ON(device) 182 #define DEVICE_OFF(device) 184 #elif (MAJOR_NR == SCSI_CDROM_MAJOR) 186 #define DEVICE_NAME"CD-ROM" 187 #define DEVICE_INTR do_sr 188 #define DEVICE_REQUEST do_sr_request 189 #define DEVICE_NR(device) (MINOR(device)) 190 #define DEVICE_ON(device) 191 #define DEVICE_OFF(device) 193 #elif (MAJOR_NR == XT_DISK_MAJOR) 195 #define DEVICE_NAME"xt disk" 196 #define DEVICE_REQUEST do_xd_request 197 #define DEVICE_NR(device) (MINOR(device) >> 6) 198 #define DEVICE_ON(device) 199 #define DEVICE_OFF(device) 201 #elif (MAJOR_NR == PS2ESDI_MAJOR) 203 #define DEVICE_NAME"PS/2 ESDI" 204 #define DEVICE_REQUEST do_ps2esdi_request 205 #define DEVICE_NR(device) (MINOR(device) >> 6) 206 #define DEVICE_ON(device) 207 #define DEVICE_OFF(device) 209 #elif (MAJOR_NR == CDU31A_CDROM_MAJOR) 211 #define DEVICE_NAME"CDU31A" 212 #define DEVICE_REQUEST do_cdu31a_request 213 #define DEVICE_NR(device) (MINOR(device)) 214 #define DEVICE_ON(device) 215 #define DEVICE_OFF(device) 217 #elif (MAJOR_NR == ACSI_MAJOR) && (defined(CONFIG_ATARI_ACSI) || defined(CONFIG_ATARI_ACSI_MODULE)) 219 #define DEVICE_NAME"ACSI" 220 #define DEVICE_INTR do_acsi 221 #define DEVICE_REQUEST do_acsi_request 222 #define DEVICE_NR(device) (MINOR(device) >> 4) 223 #define DEVICE_ON(device) 224 #define DEVICE_OFF(device) 226 #elif (MAJOR_NR == MITSUMI_CDROM_MAJOR) 228 #define DEVICE_NAME"Mitsumi CD-ROM" 229 /* #define DEVICE_INTR do_mcd */ 230 #define DEVICE_REQUEST do_mcd_request 231 #define DEVICE_NR(device) (MINOR(device)) 232 #define DEVICE_ON(device) 233 #define DEVICE_OFF(device) 235 #elif (MAJOR_NR == MITSUMI_X_CDROM_MAJOR) 237 #define DEVICE_NAME"Mitsumi CD-ROM" 238 /* #define DEVICE_INTR do_mcdx */ 239 #define DEVICE_REQUEST do_mcdx_request 240 #define DEVICE_NR(device) (MINOR(device)) 241 #define DEVICE_ON(device) 242 #define DEVICE_OFF(device) 244 #elif (MAJOR_NR == MATSUSHITA_CDROM_MAJOR) 246 #define DEVICE_NAME"Matsushita CD-ROM controller #1" 247 #define DEVICE_REQUEST do_sbpcd_request 248 #define DEVICE_NR(device) (MINOR(device)) 249 #define DEVICE_ON(device) 250 #define DEVICE_OFF(device) 252 #elif (MAJOR_NR == MATSUSHITA_CDROM2_MAJOR) 254 #define DEVICE_NAME"Matsushita CD-ROM controller #2" 255 #define DEVICE_REQUEST do_sbpcd2_request 256 #define DEVICE_NR(device) (MINOR(device)) 257 #define DEVICE_ON(device) 258 #define DEVICE_OFF(device) 260 #elif (MAJOR_NR == MATSUSHITA_CDROM3_MAJOR) 262 #define DEVICE_NAME"Matsushita CD-ROM controller #3" 263 #define DEVICE_REQUEST do_sbpcd3_request 264 #define DEVICE_NR(device) (MINOR(device)) 265 #define DEVICE_ON(device) 266 #define DEVICE_OFF(device) 268 #elif (MAJOR_NR == MATSUSHITA_CDROM4_MAJOR) 270 #define DEVICE_NAME"Matsushita CD-ROM controller #4" 271 #define DEVICE_REQUEST do_sbpcd4_request 272 #define DEVICE_NR(device) (MINOR(device)) 273 #define DEVICE_ON(device) 274 #define DEVICE_OFF(device) 276 #elif (MAJOR_NR == AZTECH_CDROM_MAJOR) 278 #define DEVICE_NAME"Aztech CD-ROM" 279 #define DEVICE_REQUEST do_aztcd_request 280 #define DEVICE_NR(device) (MINOR(device)) 281 #define DEVICE_ON(device) 282 #define DEVICE_OFF(device) 284 #elif (MAJOR_NR == CDU535_CDROM_MAJOR) 286 #define DEVICE_NAME"SONY-CDU535" 287 #define DEVICE_INTR do_cdu535 288 #define DEVICE_REQUEST do_cdu535_request 289 #define DEVICE_NR(device) (MINOR(device)) 290 #define DEVICE_ON(device) 291 #define DEVICE_OFF(device) 293 #elif (MAJOR_NR == GOLDSTAR_CDROM_MAJOR) 295 #define DEVICE_NAME"Goldstar R420" 296 #define DEVICE_REQUEST do_gscd_request 297 #define DEVICE_NR(device) (MINOR(device)) 298 #define DEVICE_ON(device) 299 #define DEVICE_OFF(device) 301 #elif (MAJOR_NR == CM206_CDROM_MAJOR) 302 #define DEVICE_NAME"Philips/LMS CD-ROM cm206" 303 #define DEVICE_REQUEST do_cm206_request 304 #define DEVICE_NR(device) (MINOR(device)) 305 #define DEVICE_ON(device) 306 #define DEVICE_OFF(device) 308 #elif (MAJOR_NR == OPTICS_CDROM_MAJOR) 310 #define DEVICE_NAME"DOLPHIN 8000AT CD-ROM" 311 #define DEVICE_REQUEST do_optcd_request 312 #define DEVICE_NR(device) (MINOR(device)) 313 #define DEVICE_ON(device) 314 #define DEVICE_OFF(device) 316 #elif (MAJOR_NR == SANYO_CDROM_MAJOR) 318 #define DEVICE_NAME"Sanyo H94A CD-ROM" 319 #define DEVICE_REQUEST do_sjcd_request 320 #define DEVICE_NR(device) (MINOR(device)) 321 #define DEVICE_ON(device) 322 #define DEVICE_OFF(device) 324 #elif (MAJOR_NR == APBLOCK_MAJOR) 326 #define DEVICE_NAME"apblock" 327 #define DEVICE_REQUEST ap_request 328 #define DEVICE_NR(device) (MINOR(device)) 329 #define DEVICE_ON(device) 330 #define DEVICE_OFF(device) 332 #elif (MAJOR_NR == DDV_MAJOR) 334 #define DEVICE_NAME"ddv" 335 #define DEVICE_REQUEST ddv_request 336 #define DEVICE_NR(device) (MINOR(device)>>PARTN_BITS) 337 #define DEVICE_ON(device) 338 #define DEVICE_OFF(device) 340 #elif (MAJOR_NR == MFM_ACORN_MAJOR) 342 #define DEVICE_NAME"mfm disk" 343 #define DEVICE_INTR do_mfm 344 #define DEVICE_REQUEST do_mfm_request 345 #define DEVICE_NR(device) (MINOR(device) >> 6) 346 #define DEVICE_ON(device) 347 #define DEVICE_OFF(device) 349 #elif (MAJOR_NR == NBD_MAJOR) 351 #define DEVICE_NAME"nbd" 352 #define DEVICE_REQUEST do_nbd_request 353 #define DEVICE_NR(device) (MINOR(device)) 354 #define DEVICE_ON(device) 355 #define DEVICE_OFF(device) 357 #elif (MAJOR_NR == I2O_MAJOR) 359 #define DEVICE_NAME"I2O block" 360 #define DEVICE_REQUEST do_i2ob_request 361 #define DEVICE_NR(device) (MINOR(device)>>4) 362 #define DEVICE_ON(device) 363 #define DEVICE_OFF(device) 365 #elif (MAJOR_NR == COMPAQ_SMART2_MAJOR) 367 #define DEVICE_NAME"ida" 368 #define DEVICE_INTR do_ida 369 #define TIMEOUT_VALUE (25*HZ) 370 #define DEVICE_REQUEST do_ida_request0 371 #define DEVICE_NR(device) (MINOR(device) >> 4) 372 #define DEVICE_ON(device) 373 #define DEVICE_OFF(device) 375 #elif (MAJOR_NR == COMPAQ_SMART2_MAJOR) 377 #define DEVICE_NAME"ida" 378 #define TIMEOUT_VALUE (25*HZ) 379 #define DEVICE_REQUEST do_ida_request0 380 #define DEVICE_NR(device) (MINOR(device) >> 4) 381 #define DEVICE_ON(device) 382 #define DEVICE_OFF(device) 384 #endif/* MAJOR_NR == whatever */ 386 #if (MAJOR_NR != SCSI_TAPE_MAJOR) 387 #if !defined(IDE_DRIVER) 390 #define CURRENT (blk_dev[MAJOR_NR].current_request) 394 #define DEVICE_NAME"unknown" 397 #define CURRENT_DEV DEVICE_NR(CURRENT->rq_dev) 400 static void(*DEVICE_INTR
)(void) = NULL
; 403 #ifdef DEVICE_TIMEOUT 406 ((timer_table[DEVICE_TIMEOUT].expires = jiffies + TIMEOUT_VALUE), \ 407 (timer_active |= 1<<DEVICE_TIMEOUT)) 409 #define CLEAR_TIMER \ 410 timer_active &= ~(1<<DEVICE_TIMEOUT) 412 #define SET_INTR(x) \ 413 if ((DEVICE_INTR = (x)) != NULL) \ 420 #define SET_INTR(x) (DEVICE_INTR = (x)) 422 #endif/* DEVICE_TIMEOUT */ 424 static void(DEVICE_REQUEST
)(void); 427 #define CLEAR_INTR SET_INTR(NULL) 432 #define INIT_REQUEST \ 437 if (MAJOR(CURRENT->rq_dev) != MAJOR_NR) \ 438 panic(DEVICE_NAME": request list destroyed"); \ 440 if (!buffer_locked(CURRENT->bh)) \ 441 panic(DEVICE_NAME": block not locked"); \ 444 #endif/* !defined(IDE_DRIVER) */ 447 #ifndef LOCAL_END_REQUEST/* If we have our own end_request, we do not want to include this mess */ 449 #if ! SCSI_BLK_MAJOR(MAJOR_NR) && (MAJOR_NR != COMPAQ_SMART2_MAJOR) 451 static voidend_request(int uptodate
) { 452 struct request
*req
= CURRENT
; 454 if(end_that_request_first(req
, uptodate
, DEVICE_NAME
)) 457 #ifndef DEVICE_NO_RANDOM 458 add_blkdev_randomness(MAJOR(req
->rq_dev
)); 460 DEVICE_OFF(req
->rq_dev
); 462 end_that_request_last(req
); 465 #endif/* ! SCSI_BLK_MAJOR(MAJOR_NR) */ 466 #endif/* LOCAL_END_REQUEST */ 468 #endif/* (MAJOR_NR != SCSI_TAPE_MAJOR) */ 469 #endif/* defined(MAJOR_NR) || defined(IDE_DRIVER) */