aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ide/ide-tape.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ide/ide-tape.c')
-rw-r--r--drivers/ide/ide-tape.c41
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
1217static 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
1232static 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
1243static void __ide_tape_discard_merge_buffer(ide_drive_t *drive) 1217static 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)