diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-10-10 16:39:38 -0400 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-10-10 16:39:38 -0400 |
commit | 0578042db3191e1ac76b53d213f2a691c3e1eaed (patch) | |
tree | 70f24c393a47e8e7906775e177372fb1348c2e56 /drivers/ide/ide-tape.c | |
parent | 0127854d7c96612a454bed6de242e28f8021fa7f (diff) |
ide: add ide_set_media_lock() helper
* Set IDE_AFLAG_NO_DOORLOCK in idetape_get_mode_sense_result(), check it
in ide_tape_set_media_lock() and cleanup idetape_create_prevent_cmd().
* Set IDE_AFLAG_NO_DOORLOCK in ide_floppy_create_read_capacity_cmd() and
check it instead of IDE_AFLAG_CLIK_DRIVE in ide_floppy_set_media_lock().
* Add ide_set_media_lock() helper and convert ide-{floppy,tape}.c to use it.
* Remove no longer used ide*_create_prevent_cmd()/ide*_set_media_lock().
* Update comment in <linux/ide.h> accordingly.
Acked-by: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide/ide-tape.c')
-rw-r--r-- | drivers/ide/ide-tape.c | 41 |
1 files changed, 10 insertions, 31 deletions
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c index 88cb94554267..b7f3eebc0d15 100644 --- a/drivers/ide/ide-tape.c +++ b/drivers/ide/ide-tape.c | |||
@@ -1214,32 +1214,6 @@ static void idetape_create_locate_cmd(ide_drive_t *drive, | |||
1214 | pc->flags |= PC_FLAG_WAIT_FOR_DSC; | 1214 | pc->flags |= PC_FLAG_WAIT_FOR_DSC; |
1215 | } | 1215 | } |
1216 | 1216 | ||
1217 | static int idetape_create_prevent_cmd(ide_drive_t *drive, | ||
1218 | struct ide_atapi_pc *pc, int prevent) | ||
1219 | { | ||
1220 | idetape_tape_t *tape = drive->driver_data; | ||
1221 | |||
1222 | /* device supports locking according to capabilities page */ | ||
1223 | if (!(tape->caps[6] & 0x01)) | ||
1224 | return 0; | ||
1225 | |||
1226 | ide_init_pc(pc); | ||
1227 | pc->c[0] = ALLOW_MEDIUM_REMOVAL; | ||
1228 | pc->c[4] = prevent; | ||
1229 | return 1; | ||
1230 | } | ||
1231 | |||
1232 | static int ide_tape_set_media_lock(ide_drive_t *drive, int on) | ||
1233 | { | ||
1234 | struct ide_tape_obj *tape = drive->driver_data; | ||
1235 | struct ide_atapi_pc pc; | ||
1236 | |||
1237 | if (!idetape_create_prevent_cmd(drive, &pc, on)) | ||
1238 | return 0; | ||
1239 | |||
1240 | return ide_queue_pc_tail(drive, tape->disk, &pc); | ||
1241 | } | ||
1242 | |||
1243 | static void __ide_tape_discard_merge_buffer(ide_drive_t *drive) | 1217 | static void __ide_tape_discard_merge_buffer(ide_drive_t *drive) |
1244 | { | 1218 | { |
1245 | idetape_tape_t *tape = drive->driver_data; | 1219 | idetape_tape_t *tape = drive->driver_data; |
@@ -1872,7 +1846,7 @@ static int idetape_mtioctop(ide_drive_t *drive, short mt_op, int mt_count) | |||
1872 | * attempting to eject. | 1846 | * attempting to eject. |
1873 | */ | 1847 | */ |
1874 | if (tape->door_locked) { | 1848 | if (tape->door_locked) { |
1875 | if (!ide_tape_set_media_lock(drive, 0)) | 1849 | if (!ide_set_media_lock(drive, disk, 0)) |
1876 | tape->door_locked = DOOR_UNLOCKED; | 1850 | tape->door_locked = DOOR_UNLOCKED; |
1877 | } | 1851 | } |
1878 | ide_tape_discard_merge_buffer(drive, 0); | 1852 | ide_tape_discard_merge_buffer(drive, 0); |
@@ -1917,13 +1891,13 @@ static int idetape_mtioctop(ide_drive_t *drive, short mt_op, int mt_count) | |||
1917 | case MTFSR: | 1891 | case MTFSR: |
1918 | case MTBSR: | 1892 | case MTBSR: |
1919 | case MTLOCK: | 1893 | case MTLOCK: |
1920 | retval = ide_tape_set_media_lock(drive, 1); | 1894 | retval = ide_set_media_lock(drive, disk, 1); |
1921 | if (retval) | 1895 | if (retval) |
1922 | return retval; | 1896 | return retval; |
1923 | tape->door_locked = DOOR_EXPLICITLY_LOCKED; | 1897 | tape->door_locked = DOOR_EXPLICITLY_LOCKED; |
1924 | return 0; | 1898 | return 0; |
1925 | case MTUNLOCK: | 1899 | case MTUNLOCK: |
1926 | retval = ide_tape_set_media_lock(drive, 0); | 1900 | retval = ide_set_media_lock(drive, disk, 0); |
1927 | if (retval) | 1901 | if (retval) |
1928 | return retval; | 1902 | return retval; |
1929 | tape->door_locked = DOOR_UNLOCKED; | 1903 | tape->door_locked = DOOR_UNLOCKED; |
@@ -2087,7 +2061,7 @@ static int idetape_chrdev_open(struct inode *inode, struct file *filp) | |||
2087 | 2061 | ||
2088 | /* Lock the tape drive door so user can't eject. */ | 2062 | /* Lock the tape drive door so user can't eject. */ |
2089 | if (tape->chrdev_dir == IDETAPE_DIR_NONE) { | 2063 | if (tape->chrdev_dir == IDETAPE_DIR_NONE) { |
2090 | if (!ide_tape_set_media_lock(drive, 1)) { | 2064 | if (!ide_set_media_lock(drive, tape->disk, 1)) { |
2091 | if (tape->door_locked != DOOR_EXPLICITLY_LOCKED) | 2065 | if (tape->door_locked != DOOR_EXPLICITLY_LOCKED) |
2092 | tape->door_locked = DOOR_LOCKED; | 2066 | tape->door_locked = DOOR_LOCKED; |
2093 | } | 2067 | } |
@@ -2140,7 +2114,7 @@ static int idetape_chrdev_release(struct inode *inode, struct file *filp) | |||
2140 | (void) idetape_rewind_tape(drive); | 2114 | (void) idetape_rewind_tape(drive); |
2141 | if (tape->chrdev_dir == IDETAPE_DIR_NONE) { | 2115 | if (tape->chrdev_dir == IDETAPE_DIR_NONE) { |
2142 | if (tape->door_locked == DOOR_LOCKED) { | 2116 | if (tape->door_locked == DOOR_LOCKED) { |
2143 | if (!ide_tape_set_media_lock(drive, 0)) | 2117 | if (!ide_set_media_lock(drive, tape->disk, 0)) |
2144 | tape->door_locked = DOOR_UNLOCKED; | 2118 | tape->door_locked = DOOR_UNLOCKED; |
2145 | } | 2119 | } |
2146 | } | 2120 | } |
@@ -2218,6 +2192,11 @@ static void idetape_get_mode_sense_results(ide_drive_t *drive) | |||
2218 | } | 2192 | } |
2219 | 2193 | ||
2220 | memcpy(&tape->caps, caps, 20); | 2194 | memcpy(&tape->caps, caps, 20); |
2195 | |||
2196 | /* device lacks locking support according to capabilities page */ | ||
2197 | if ((caps[6] & 1) == 0) | ||
2198 | drive->atapi_flags |= IDE_AFLAG_NO_DOORLOCK; | ||
2199 | |||
2221 | if (caps[7] & 0x02) | 2200 | if (caps[7] & 0x02) |
2222 | tape->blk_size = 512; | 2201 | tape->blk_size = 512; |
2223 | else if (caps[7] & 0x04) | 2202 | else if (caps[7] & 0x04) |