blk.h
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:10k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

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