14b83e99eSJens Axboe /* 24b83e99eSJens Axboe * Copyright (C) 2000 Jens Axboe <[email protected]> 34b83e99eSJens Axboe * Copyright (C) 2001-2004 Peter Osterlund <[email protected]> 44b83e99eSJens Axboe * 54b83e99eSJens Axboe * May be copied or modified under the terms of the GNU General Public 64b83e99eSJens Axboe * License. See linux/COPYING for more information. 74b83e99eSJens Axboe * 84b83e99eSJens Axboe * Packet writing layer for ATAPI and SCSI CD-R, CD-RW, DVD-R, and 94b83e99eSJens Axboe * DVD-RW devices. 104b83e99eSJens Axboe * 114b83e99eSJens Axboe */ 124b83e99eSJens Axboe #ifndef __PKTCDVD_H 134b83e99eSJens Axboe #define __PKTCDVD_H 144b83e99eSJens Axboe 154b83e99eSJens Axboe #include <linux/blkdev.h> 164b83e99eSJens Axboe #include <linux/completion.h> 174b83e99eSJens Axboe #include <linux/cdrom.h> 184b83e99eSJens Axboe #include <linux/kobject.h> 194b83e99eSJens Axboe #include <linux/sysfs.h> 204b83e99eSJens Axboe #include <linux/mempool.h> 214b83e99eSJens Axboe #include <uapi/linux/pktcdvd.h> 224b83e99eSJens Axboe 234b83e99eSJens Axboe /* default bio write queue congestion marks */ 244b83e99eSJens Axboe #define PKT_WRITE_CONGESTION_ON 10000 254b83e99eSJens Axboe #define PKT_WRITE_CONGESTION_OFF 9000 264b83e99eSJens Axboe 274b83e99eSJens Axboe 284b83e99eSJens Axboe struct packet_settings 294b83e99eSJens Axboe { 304b83e99eSJens Axboe __u32 size; /* packet size in (512 byte) sectors */ 314b83e99eSJens Axboe __u8 fp; /* fixed packets */ 324b83e99eSJens Axboe __u8 link_loss; /* the rest is specified 334b83e99eSJens Axboe * as per Mt Fuji */ 344b83e99eSJens Axboe __u8 write_type; 354b83e99eSJens Axboe __u8 track_mode; 364b83e99eSJens Axboe __u8 block_mode; 374b83e99eSJens Axboe }; 384b83e99eSJens Axboe 394b83e99eSJens Axboe /* 404b83e99eSJens Axboe * Very crude stats for now 414b83e99eSJens Axboe */ 424b83e99eSJens Axboe struct packet_stats 434b83e99eSJens Axboe { 444b83e99eSJens Axboe unsigned long pkt_started; 454b83e99eSJens Axboe unsigned long pkt_ended; 464b83e99eSJens Axboe unsigned long secs_w; 474b83e99eSJens Axboe unsigned long secs_rg; 484b83e99eSJens Axboe unsigned long secs_r; 494b83e99eSJens Axboe }; 504b83e99eSJens Axboe 514b83e99eSJens Axboe struct packet_cdrw 524b83e99eSJens Axboe { 534b83e99eSJens Axboe struct list_head pkt_free_list; 544b83e99eSJens Axboe struct list_head pkt_active_list; 554b83e99eSJens Axboe spinlock_t active_list_lock; /* Serialize access to pkt_active_list */ 564b83e99eSJens Axboe struct task_struct *thread; 574b83e99eSJens Axboe atomic_t pending_bios; 584b83e99eSJens Axboe }; 594b83e99eSJens Axboe 604b83e99eSJens Axboe /* 614b83e99eSJens Axboe * Switch to high speed reading after reading this many kilobytes 624b83e99eSJens Axboe * with no interspersed writes. 634b83e99eSJens Axboe */ 644b83e99eSJens Axboe #define HI_SPEED_SWITCH 512 654b83e99eSJens Axboe 664b83e99eSJens Axboe struct packet_iosched 674b83e99eSJens Axboe { 684b83e99eSJens Axboe atomic_t attention; /* Set to non-zero when queue processing is needed */ 694b83e99eSJens Axboe int writing; /* Non-zero when writing, zero when reading */ 704b83e99eSJens Axboe spinlock_t lock; /* Protecting read/write queue manipulations */ 714b83e99eSJens Axboe struct bio_list read_queue; 724b83e99eSJens Axboe struct bio_list write_queue; 734b83e99eSJens Axboe sector_t last_write; /* The sector where the last write ended */ 744b83e99eSJens Axboe int successive_reads; 754b83e99eSJens Axboe }; 764b83e99eSJens Axboe 774b83e99eSJens Axboe /* 784b83e99eSJens Axboe * 32 buffers of 2048 bytes 794b83e99eSJens Axboe */ 804b83e99eSJens Axboe #if (PAGE_SIZE % CD_FRAMESIZE) != 0 814b83e99eSJens Axboe #error "PAGE_SIZE must be a multiple of CD_FRAMESIZE" 824b83e99eSJens Axboe #endif 834b83e99eSJens Axboe #define PACKET_MAX_SIZE 128 844b83e99eSJens Axboe #define FRAMES_PER_PAGE (PAGE_SIZE / CD_FRAMESIZE) 854b83e99eSJens Axboe #define PACKET_MAX_SECTORS (PACKET_MAX_SIZE * CD_FRAMESIZE >> 9) 864b83e99eSJens Axboe 874b83e99eSJens Axboe enum packet_data_state { 884b83e99eSJens Axboe PACKET_IDLE_STATE, /* Not used at the moment */ 894b83e99eSJens Axboe PACKET_WAITING_STATE, /* Waiting for more bios to arrive, so */ 904b83e99eSJens Axboe /* we don't have to do as much */ 914b83e99eSJens Axboe /* data gathering */ 924b83e99eSJens Axboe PACKET_READ_WAIT_STATE, /* Waiting for reads to fill in holes */ 934b83e99eSJens Axboe PACKET_WRITE_WAIT_STATE, /* Waiting for the write to complete */ 944b83e99eSJens Axboe PACKET_RECOVERY_STATE, /* Recover after read/write errors */ 954b83e99eSJens Axboe PACKET_FINISHED_STATE, /* After write has finished */ 964b83e99eSJens Axboe 974b83e99eSJens Axboe PACKET_NUM_STATES /* Number of possible states */ 984b83e99eSJens Axboe }; 994b83e99eSJens Axboe 1004b83e99eSJens Axboe /* 1014b83e99eSJens Axboe * Information needed for writing a single packet 1024b83e99eSJens Axboe */ 1034b83e99eSJens Axboe struct pktcdvd_device; 1044b83e99eSJens Axboe 1054b83e99eSJens Axboe struct packet_data 1064b83e99eSJens Axboe { 1074b83e99eSJens Axboe struct list_head list; 1084b83e99eSJens Axboe 1094b83e99eSJens Axboe spinlock_t lock; /* Lock protecting state transitions and */ 1104b83e99eSJens Axboe /* orig_bios list */ 1114b83e99eSJens Axboe 1124b83e99eSJens Axboe struct bio_list orig_bios; /* Original bios passed to pkt_make_request */ 1134b83e99eSJens Axboe /* that will be handled by this packet */ 1144b83e99eSJens Axboe int write_size; /* Total size of all bios in the orig_bios */ 1154b83e99eSJens Axboe /* list, measured in number of frames */ 1164b83e99eSJens Axboe 1174b83e99eSJens Axboe struct bio *w_bio; /* The bio we will send to the real CD */ 1184b83e99eSJens Axboe /* device once we have all data for the */ 1194b83e99eSJens Axboe /* packet we are going to write */ 1204b83e99eSJens Axboe sector_t sector; /* First sector in this packet */ 1214b83e99eSJens Axboe int frames; /* Number of frames in this packet */ 1224b83e99eSJens Axboe 1234b83e99eSJens Axboe enum packet_data_state state; /* Current state */ 1244b83e99eSJens Axboe atomic_t run_sm; /* Incremented whenever the state */ 1254b83e99eSJens Axboe /* machine needs to be run */ 1264b83e99eSJens Axboe long sleep_time; /* Set this to non-zero to make the state */ 1274b83e99eSJens Axboe /* machine run after this many jiffies. */ 1284b83e99eSJens Axboe 1294b83e99eSJens Axboe atomic_t io_wait; /* Number of pending IO operations */ 1304b83e99eSJens Axboe atomic_t io_errors; /* Number of read/write errors during IO */ 1314b83e99eSJens Axboe 1324b83e99eSJens Axboe struct bio *r_bios[PACKET_MAX_SIZE]; /* bios to use during data gathering */ 1334b83e99eSJens Axboe struct page *pages[PACKET_MAX_SIZE / FRAMES_PER_PAGE]; 1344b83e99eSJens Axboe 1354b83e99eSJens Axboe int cache_valid; /* If non-zero, the data for the zone defined */ 1364b83e99eSJens Axboe /* by the sector variable is completely cached */ 1374b83e99eSJens Axboe /* in the pages[] vector. */ 1384b83e99eSJens Axboe 1394b83e99eSJens Axboe int id; /* ID number for debugging */ 1404b83e99eSJens Axboe struct pktcdvd_device *pd; 1414b83e99eSJens Axboe }; 1424b83e99eSJens Axboe 1434b83e99eSJens Axboe struct pkt_rb_node { 1444b83e99eSJens Axboe struct rb_node rb_node; 1454b83e99eSJens Axboe struct bio *bio; 1464b83e99eSJens Axboe }; 1474b83e99eSJens Axboe 1484b83e99eSJens Axboe struct packet_stacked_data 1494b83e99eSJens Axboe { 1504b83e99eSJens Axboe struct bio *bio; /* Original read request bio */ 1514b83e99eSJens Axboe struct pktcdvd_device *pd; 1524b83e99eSJens Axboe }; 1534b83e99eSJens Axboe #define PSD_POOL_SIZE 64 1544b83e99eSJens Axboe 1554b83e99eSJens Axboe struct pktcdvd_device 1564b83e99eSJens Axboe { 157*05fb1dbcSChristian Brauner struct file *bdev_file; /* dev attached */ 1587ac86df8SJan Kara /* handle acquired for bdev during pkt_open_dev() */ 159*05fb1dbcSChristian Brauner struct file *f_open_bdev; 1604b83e99eSJens Axboe dev_t pkt_dev; /* our dev */ 1614b83e99eSJens Axboe struct packet_settings settings; 1624b83e99eSJens Axboe struct packet_stats stats; 1634b83e99eSJens Axboe int refcnt; /* Open count */ 1644b83e99eSJens Axboe int write_speed; /* current write speed, kB/s */ 1654b83e99eSJens Axboe int read_speed; /* current read speed, kB/s */ 1664b83e99eSJens Axboe unsigned long offset; /* start offset */ 1674b83e99eSJens Axboe __u8 mode_offset; /* 0 / 8 */ 1684b83e99eSJens Axboe __u8 type; 1694b83e99eSJens Axboe unsigned long flags; 1704b83e99eSJens Axboe __u16 mmc3_profile; 1714b83e99eSJens Axboe __u32 nwa; /* next writable address */ 1724b83e99eSJens Axboe __u32 lra; /* last recorded address */ 1734b83e99eSJens Axboe struct packet_cdrw cdrw; 1744b83e99eSJens Axboe wait_queue_head_t wqueue; 1754b83e99eSJens Axboe 1764b83e99eSJens Axboe spinlock_t lock; /* Serialize access to bio_queue */ 1774b83e99eSJens Axboe struct rb_root bio_queue; /* Work queue of bios we need to handle */ 1784b83e99eSJens Axboe int bio_queue_size; /* Number of nodes in bio_queue */ 1794b83e99eSJens Axboe bool congested; /* Someone is waiting for bio_queue_size 1804b83e99eSJens Axboe * to drop. */ 1814b83e99eSJens Axboe sector_t current_sector; /* Keep track of where the elevator is */ 1824b83e99eSJens Axboe atomic_t scan_queue; /* Set to non-zero when pkt_handle_queue */ 1834b83e99eSJens Axboe /* needs to be run. */ 1844b83e99eSJens Axboe mempool_t rb_pool; /* mempool for pkt_rb_node allocations */ 1854b83e99eSJens Axboe 1864b83e99eSJens Axboe struct packet_iosched iosched; 1874b83e99eSJens Axboe struct gendisk *disk; 1884b83e99eSJens Axboe 1894b83e99eSJens Axboe int write_congestion_off; 1904b83e99eSJens Axboe int write_congestion_on; 1914b83e99eSJens Axboe 1924b83e99eSJens Axboe struct device *dev; /* sysfs pktcdvd[0-7] dev */ 1934b83e99eSJens Axboe 1944b83e99eSJens Axboe struct dentry *dfs_d_root; /* debugfs: devname directory */ 1954b83e99eSJens Axboe struct dentry *dfs_f_info; /* debugfs: info file */ 1964b83e99eSJens Axboe }; 1974b83e99eSJens Axboe 1984b83e99eSJens Axboe #endif /* __PKTCDVD_H */ 199