ide: add ide_init_pc() helper
* Add IDE_PC_BUFFER_SIZE define. * Add ide_init_pc() and convert ide-{floppy,tape}.c to use it instead of ide*_init_pc(). * Remove no longer used IDE*_PC_BUFFER_SIZE and ide*_init_pc(). There should be no functional changes caused by this patch. Acked-by: Borislav Petkov <petkovbb@gmail.com> Acked-by: Sergei Shtylyov <sshtylyov@ru.mvista.com> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
This commit is contained in:
parent
385a4b8787
commit
7bf7420a31
|
@ -111,6 +111,14 @@ int ide_io_buffers(ide_drive_t *drive, struct ide_atapi_pc *pc,
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(ide_io_buffers);
|
EXPORT_SYMBOL_GPL(ide_io_buffers);
|
||||||
|
|
||||||
|
void ide_init_pc(struct ide_atapi_pc *pc)
|
||||||
|
{
|
||||||
|
memset(pc, 0, sizeof(*pc));
|
||||||
|
pc->buf = pc->pc_buf;
|
||||||
|
pc->buf_size = IDE_PC_BUFFER_SIZE;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(ide_init_pc);
|
||||||
|
|
||||||
/* TODO: unify the code thus making some arguments go away */
|
/* TODO: unify the code thus making some arguments go away */
|
||||||
ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc,
|
ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc,
|
||||||
ide_handler_t *handler, unsigned int timeout, ide_expiry_t *expiry,
|
ide_handler_t *handler, unsigned int timeout, ide_expiry_t *expiry,
|
||||||
|
|
|
@ -69,12 +69,6 @@
|
||||||
*/
|
*/
|
||||||
#define IDEFLOPPY_MAX_PC_RETRIES 3
|
#define IDEFLOPPY_MAX_PC_RETRIES 3
|
||||||
|
|
||||||
/*
|
|
||||||
* With each packet command, we allocate a buffer of IDEFLOPPY_PC_BUFFER_SIZE
|
|
||||||
* bytes.
|
|
||||||
*/
|
|
||||||
#define IDEFLOPPY_PC_BUFFER_SIZE 256
|
|
||||||
|
|
||||||
/* format capacities descriptor codes */
|
/* format capacities descriptor codes */
|
||||||
#define CAPACITY_INVALID 0x00
|
#define CAPACITY_INVALID 0x00
|
||||||
#define CAPACITY_UNFORMATTED 0x01
|
#define CAPACITY_UNFORMATTED 0x01
|
||||||
|
@ -274,16 +268,9 @@ static void ide_floppy_callback(ide_drive_t *drive)
|
||||||
idefloppy_end_request(drive, uptodate, 0);
|
idefloppy_end_request(drive, uptodate, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void idefloppy_init_pc(struct ide_atapi_pc *pc)
|
|
||||||
{
|
|
||||||
memset(pc, 0, sizeof(*pc));
|
|
||||||
pc->buf = pc->pc_buf;
|
|
||||||
pc->buf_size = IDEFLOPPY_PC_BUFFER_SIZE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void idefloppy_create_request_sense_cmd(struct ide_atapi_pc *pc)
|
static void idefloppy_create_request_sense_cmd(struct ide_atapi_pc *pc)
|
||||||
{
|
{
|
||||||
idefloppy_init_pc(pc);
|
ide_init_pc(pc);
|
||||||
pc->c[0] = GPCMD_REQUEST_SENSE;
|
pc->c[0] = GPCMD_REQUEST_SENSE;
|
||||||
pc->c[4] = 255;
|
pc->c[4] = 255;
|
||||||
pc->req_xfer = 18;
|
pc->req_xfer = 18;
|
||||||
|
@ -413,14 +400,14 @@ static void idefloppy_create_prevent_cmd(struct ide_atapi_pc *pc, int prevent)
|
||||||
{
|
{
|
||||||
debug_log("creating prevent removal command, prevent = %d\n", prevent);
|
debug_log("creating prevent removal command, prevent = %d\n", prevent);
|
||||||
|
|
||||||
idefloppy_init_pc(pc);
|
ide_init_pc(pc);
|
||||||
pc->c[0] = GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL;
|
pc->c[0] = GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL;
|
||||||
pc->c[4] = prevent;
|
pc->c[4] = prevent;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void idefloppy_create_read_capacity_cmd(struct ide_atapi_pc *pc)
|
static void idefloppy_create_read_capacity_cmd(struct ide_atapi_pc *pc)
|
||||||
{
|
{
|
||||||
idefloppy_init_pc(pc);
|
ide_init_pc(pc);
|
||||||
pc->c[0] = GPCMD_READ_FORMAT_CAPACITIES;
|
pc->c[0] = GPCMD_READ_FORMAT_CAPACITIES;
|
||||||
pc->c[7] = 255;
|
pc->c[7] = 255;
|
||||||
pc->c[8] = 255;
|
pc->c[8] = 255;
|
||||||
|
@ -430,7 +417,7 @@ static void idefloppy_create_read_capacity_cmd(struct ide_atapi_pc *pc)
|
||||||
static void idefloppy_create_format_unit_cmd(struct ide_atapi_pc *pc, int b,
|
static void idefloppy_create_format_unit_cmd(struct ide_atapi_pc *pc, int b,
|
||||||
int l, int flags)
|
int l, int flags)
|
||||||
{
|
{
|
||||||
idefloppy_init_pc(pc);
|
ide_init_pc(pc);
|
||||||
pc->c[0] = GPCMD_FORMAT_UNIT;
|
pc->c[0] = GPCMD_FORMAT_UNIT;
|
||||||
pc->c[1] = 0x17;
|
pc->c[1] = 0x17;
|
||||||
|
|
||||||
|
@ -454,7 +441,7 @@ static void idefloppy_create_mode_sense_cmd(struct ide_atapi_pc *pc,
|
||||||
{
|
{
|
||||||
u16 length = 8; /* sizeof(Mode Parameter Header) = 8 Bytes */
|
u16 length = 8; /* sizeof(Mode Parameter Header) = 8 Bytes */
|
||||||
|
|
||||||
idefloppy_init_pc(pc);
|
ide_init_pc(pc);
|
||||||
pc->c[0] = GPCMD_MODE_SENSE_10;
|
pc->c[0] = GPCMD_MODE_SENSE_10;
|
||||||
pc->c[1] = 0;
|
pc->c[1] = 0;
|
||||||
pc->c[2] = page_code;
|
pc->c[2] = page_code;
|
||||||
|
@ -476,7 +463,7 @@ static void idefloppy_create_mode_sense_cmd(struct ide_atapi_pc *pc,
|
||||||
|
|
||||||
static void idefloppy_create_start_stop_cmd(struct ide_atapi_pc *pc, int start)
|
static void idefloppy_create_start_stop_cmd(struct ide_atapi_pc *pc, int start)
|
||||||
{
|
{
|
||||||
idefloppy_init_pc(pc);
|
ide_init_pc(pc);
|
||||||
pc->c[0] = GPCMD_START_STOP_UNIT;
|
pc->c[0] = GPCMD_START_STOP_UNIT;
|
||||||
pc->c[4] = start;
|
pc->c[4] = start;
|
||||||
}
|
}
|
||||||
|
@ -492,7 +479,7 @@ static void idefloppy_create_rw_cmd(idefloppy_floppy_t *floppy,
|
||||||
debug_log("create_rw10_cmd: block == %d, blocks == %d\n",
|
debug_log("create_rw10_cmd: block == %d, blocks == %d\n",
|
||||||
block, blocks);
|
block, blocks);
|
||||||
|
|
||||||
idefloppy_init_pc(pc);
|
ide_init_pc(pc);
|
||||||
pc->c[0] = cmd == READ ? GPCMD_READ_10 : GPCMD_WRITE_10;
|
pc->c[0] = cmd == READ ? GPCMD_READ_10 : GPCMD_WRITE_10;
|
||||||
put_unaligned(cpu_to_be16(blocks), (unsigned short *)&pc->c[7]);
|
put_unaligned(cpu_to_be16(blocks), (unsigned short *)&pc->c[7]);
|
||||||
put_unaligned(cpu_to_be32(block), (unsigned int *) &pc->c[2]);
|
put_unaligned(cpu_to_be32(block), (unsigned int *) &pc->c[2]);
|
||||||
|
@ -511,7 +498,7 @@ static void idefloppy_create_rw_cmd(idefloppy_floppy_t *floppy,
|
||||||
static void idefloppy_blockpc_cmd(idefloppy_floppy_t *floppy,
|
static void idefloppy_blockpc_cmd(idefloppy_floppy_t *floppy,
|
||||||
struct ide_atapi_pc *pc, struct request *rq)
|
struct ide_atapi_pc *pc, struct request *rq)
|
||||||
{
|
{
|
||||||
idefloppy_init_pc(pc);
|
ide_init_pc(pc);
|
||||||
memcpy(pc->c, rq->cmd, sizeof(pc->c));
|
memcpy(pc->c, rq->cmd, sizeof(pc->c));
|
||||||
pc->rq = rq;
|
pc->rq = rq;
|
||||||
pc->b_count = 0;
|
pc->b_count = 0;
|
||||||
|
@ -1071,7 +1058,7 @@ static int idefloppy_open(struct inode *inode, struct file *filp)
|
||||||
drive->atapi_flags &= ~IDE_AFLAG_FORMAT_IN_PROGRESS;
|
drive->atapi_flags &= ~IDE_AFLAG_FORMAT_IN_PROGRESS;
|
||||||
/* Just in case */
|
/* Just in case */
|
||||||
|
|
||||||
idefloppy_init_pc(&pc);
|
ide_init_pc(&pc);
|
||||||
pc.c[0] = GPCMD_TEST_UNIT_READY;
|
pc.c[0] = GPCMD_TEST_UNIT_READY;
|
||||||
|
|
||||||
if (idefloppy_queue_pc_tail(drive, &pc)) {
|
if (idefloppy_queue_pc_tail(drive, &pc)) {
|
||||||
|
|
|
@ -80,12 +80,6 @@ enum {
|
||||||
*/
|
*/
|
||||||
#define IDETAPE_MAX_PC_RETRIES 3
|
#define IDETAPE_MAX_PC_RETRIES 3
|
||||||
|
|
||||||
/*
|
|
||||||
* With each packet command, we allocate a buffer of IDETAPE_PC_BUFFER_SIZE
|
|
||||||
* bytes. This is used for several packet commands (Not for READ/WRITE commands)
|
|
||||||
*/
|
|
||||||
#define IDETAPE_PC_BUFFER_SIZE 256
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Some drives (for example, Seagate STT3401A Travan) require a very long
|
* Some drives (for example, Seagate STT3401A Travan) require a very long
|
||||||
* timeout, because they don't return an interrupt or clear their busy bit
|
* timeout, because they don't return an interrupt or clear their busy bit
|
||||||
|
@ -610,21 +604,9 @@ static void ide_tape_callback(ide_drive_t *drive)
|
||||||
idetape_end_request(drive, uptodate, 0);
|
idetape_end_request(drive, uptodate, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void idetape_init_pc(struct ide_atapi_pc *pc)
|
|
||||||
{
|
|
||||||
memset(pc->c, 0, 12);
|
|
||||||
pc->retries = 0;
|
|
||||||
pc->flags = 0;
|
|
||||||
pc->req_xfer = 0;
|
|
||||||
pc->buf = pc->pc_buf;
|
|
||||||
pc->buf_size = IDETAPE_PC_BUFFER_SIZE;
|
|
||||||
pc->bh = NULL;
|
|
||||||
pc->b_data = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void idetape_create_request_sense_cmd(struct ide_atapi_pc *pc)
|
static void idetape_create_request_sense_cmd(struct ide_atapi_pc *pc)
|
||||||
{
|
{
|
||||||
idetape_init_pc(pc);
|
ide_init_pc(pc);
|
||||||
pc->c[0] = REQUEST_SENSE;
|
pc->c[0] = REQUEST_SENSE;
|
||||||
pc->c[4] = 20;
|
pc->c[4] = 20;
|
||||||
pc->req_xfer = 20;
|
pc->req_xfer = 20;
|
||||||
|
@ -816,7 +798,7 @@ static ide_startstop_t idetape_issue_pc(ide_drive_t *drive,
|
||||||
/* A mode sense command is used to "sense" tape parameters. */
|
/* A mode sense command is used to "sense" tape parameters. */
|
||||||
static void idetape_create_mode_sense_cmd(struct ide_atapi_pc *pc, u8 page_code)
|
static void idetape_create_mode_sense_cmd(struct ide_atapi_pc *pc, u8 page_code)
|
||||||
{
|
{
|
||||||
idetape_init_pc(pc);
|
ide_init_pc(pc);
|
||||||
pc->c[0] = MODE_SENSE;
|
pc->c[0] = MODE_SENSE;
|
||||||
if (page_code != IDETAPE_BLOCK_DESCRIPTOR)
|
if (page_code != IDETAPE_BLOCK_DESCRIPTOR)
|
||||||
/* DBD = 1 - Don't return block descriptors */
|
/* DBD = 1 - Don't return block descriptors */
|
||||||
|
@ -875,7 +857,7 @@ static void ide_tape_create_rw_cmd(idetape_tape_t *tape,
|
||||||
struct idetape_bh *bh = (struct idetape_bh *)rq->special;
|
struct idetape_bh *bh = (struct idetape_bh *)rq->special;
|
||||||
unsigned int length = rq->current_nr_sectors;
|
unsigned int length = rq->current_nr_sectors;
|
||||||
|
|
||||||
idetape_init_pc(pc);
|
ide_init_pc(pc);
|
||||||
put_unaligned(cpu_to_be32(length), (unsigned int *) &pc->c[1]);
|
put_unaligned(cpu_to_be32(length), (unsigned int *) &pc->c[1]);
|
||||||
pc->c[1] = 1;
|
pc->c[1] = 1;
|
||||||
pc->bh = bh;
|
pc->bh = bh;
|
||||||
|
@ -1165,7 +1147,7 @@ static void idetape_init_merge_buffer(idetape_tape_t *tape)
|
||||||
static void idetape_create_write_filemark_cmd(ide_drive_t *drive,
|
static void idetape_create_write_filemark_cmd(ide_drive_t *drive,
|
||||||
struct ide_atapi_pc *pc, int write_filemark)
|
struct ide_atapi_pc *pc, int write_filemark)
|
||||||
{
|
{
|
||||||
idetape_init_pc(pc);
|
ide_init_pc(pc);
|
||||||
pc->c[0] = WRITE_FILEMARKS;
|
pc->c[0] = WRITE_FILEMARKS;
|
||||||
pc->c[4] = write_filemark;
|
pc->c[4] = write_filemark;
|
||||||
pc->flags |= PC_FLAG_WAIT_FOR_DSC;
|
pc->flags |= PC_FLAG_WAIT_FOR_DSC;
|
||||||
|
@ -1173,7 +1155,7 @@ static void idetape_create_write_filemark_cmd(ide_drive_t *drive,
|
||||||
|
|
||||||
static void idetape_create_test_unit_ready_cmd(struct ide_atapi_pc *pc)
|
static void idetape_create_test_unit_ready_cmd(struct ide_atapi_pc *pc)
|
||||||
{
|
{
|
||||||
idetape_init_pc(pc);
|
ide_init_pc(pc);
|
||||||
pc->c[0] = TEST_UNIT_READY;
|
pc->c[0] = TEST_UNIT_READY;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1200,7 +1182,7 @@ static int idetape_queue_pc_tail(ide_drive_t *drive, struct ide_atapi_pc *pc)
|
||||||
static void idetape_create_load_unload_cmd(ide_drive_t *drive,
|
static void idetape_create_load_unload_cmd(ide_drive_t *drive,
|
||||||
struct ide_atapi_pc *pc, int cmd)
|
struct ide_atapi_pc *pc, int cmd)
|
||||||
{
|
{
|
||||||
idetape_init_pc(pc);
|
ide_init_pc(pc);
|
||||||
pc->c[0] = START_STOP;
|
pc->c[0] = START_STOP;
|
||||||
pc->c[4] = cmd;
|
pc->c[4] = cmd;
|
||||||
pc->flags |= PC_FLAG_WAIT_FOR_DSC;
|
pc->flags |= PC_FLAG_WAIT_FOR_DSC;
|
||||||
|
@ -1252,7 +1234,7 @@ static int idetape_flush_tape_buffers(ide_drive_t *drive)
|
||||||
|
|
||||||
static void idetape_create_read_position_cmd(struct ide_atapi_pc *pc)
|
static void idetape_create_read_position_cmd(struct ide_atapi_pc *pc)
|
||||||
{
|
{
|
||||||
idetape_init_pc(pc);
|
ide_init_pc(pc);
|
||||||
pc->c[0] = READ_POSITION;
|
pc->c[0] = READ_POSITION;
|
||||||
pc->req_xfer = 20;
|
pc->req_xfer = 20;
|
||||||
}
|
}
|
||||||
|
@ -1276,7 +1258,7 @@ static void idetape_create_locate_cmd(ide_drive_t *drive,
|
||||||
struct ide_atapi_pc *pc,
|
struct ide_atapi_pc *pc,
|
||||||
unsigned int block, u8 partition, int skip)
|
unsigned int block, u8 partition, int skip)
|
||||||
{
|
{
|
||||||
idetape_init_pc(pc);
|
ide_init_pc(pc);
|
||||||
pc->c[0] = POSITION_TO_ELEMENT;
|
pc->c[0] = POSITION_TO_ELEMENT;
|
||||||
pc->c[1] = 2;
|
pc->c[1] = 2;
|
||||||
put_unaligned(cpu_to_be32(block), (unsigned int *) &pc->c[3]);
|
put_unaligned(cpu_to_be32(block), (unsigned int *) &pc->c[3]);
|
||||||
|
@ -1293,7 +1275,7 @@ static int idetape_create_prevent_cmd(ide_drive_t *drive,
|
||||||
if (!(tape->caps[6] & 0x01))
|
if (!(tape->caps[6] & 0x01))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
idetape_init_pc(pc);
|
ide_init_pc(pc);
|
||||||
pc->c[0] = ALLOW_MEDIUM_REMOVAL;
|
pc->c[0] = ALLOW_MEDIUM_REMOVAL;
|
||||||
pc->c[4] = prevent;
|
pc->c[4] = prevent;
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -1408,7 +1390,7 @@ static int idetape_queue_rw_tail(ide_drive_t *drive, int cmd, int blocks,
|
||||||
|
|
||||||
static void idetape_create_inquiry_cmd(struct ide_atapi_pc *pc)
|
static void idetape_create_inquiry_cmd(struct ide_atapi_pc *pc)
|
||||||
{
|
{
|
||||||
idetape_init_pc(pc);
|
ide_init_pc(pc);
|
||||||
pc->c[0] = INQUIRY;
|
pc->c[0] = INQUIRY;
|
||||||
pc->c[4] = 254;
|
pc->c[4] = 254;
|
||||||
pc->req_xfer = 254;
|
pc->req_xfer = 254;
|
||||||
|
@ -1417,14 +1399,14 @@ static void idetape_create_inquiry_cmd(struct ide_atapi_pc *pc)
|
||||||
static void idetape_create_rewind_cmd(ide_drive_t *drive,
|
static void idetape_create_rewind_cmd(ide_drive_t *drive,
|
||||||
struct ide_atapi_pc *pc)
|
struct ide_atapi_pc *pc)
|
||||||
{
|
{
|
||||||
idetape_init_pc(pc);
|
ide_init_pc(pc);
|
||||||
pc->c[0] = REZERO_UNIT;
|
pc->c[0] = REZERO_UNIT;
|
||||||
pc->flags |= PC_FLAG_WAIT_FOR_DSC;
|
pc->flags |= PC_FLAG_WAIT_FOR_DSC;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void idetape_create_erase_cmd(struct ide_atapi_pc *pc)
|
static void idetape_create_erase_cmd(struct ide_atapi_pc *pc)
|
||||||
{
|
{
|
||||||
idetape_init_pc(pc);
|
ide_init_pc(pc);
|
||||||
pc->c[0] = ERASE;
|
pc->c[0] = ERASE;
|
||||||
pc->c[1] = 1;
|
pc->c[1] = 1;
|
||||||
pc->flags |= PC_FLAG_WAIT_FOR_DSC;
|
pc->flags |= PC_FLAG_WAIT_FOR_DSC;
|
||||||
|
@ -1432,7 +1414,7 @@ static void idetape_create_erase_cmd(struct ide_atapi_pc *pc)
|
||||||
|
|
||||||
static void idetape_create_space_cmd(struct ide_atapi_pc *pc, int count, u8 cmd)
|
static void idetape_create_space_cmd(struct ide_atapi_pc *pc, int count, u8 cmd)
|
||||||
{
|
{
|
||||||
idetape_init_pc(pc);
|
ide_init_pc(pc);
|
||||||
pc->c[0] = SPACE;
|
pc->c[0] = SPACE;
|
||||||
put_unaligned(cpu_to_be32(count), (unsigned int *) &pc->c[1]);
|
put_unaligned(cpu_to_be32(count), (unsigned int *) &pc->c[1]);
|
||||||
pc->c[1] = cmd;
|
pc->c[1] = cmd;
|
||||||
|
|
|
@ -724,6 +724,12 @@ enum {
|
||||||
PC_FLAG_TIMEDOUT = (1 << 7),
|
PC_FLAG_TIMEDOUT = (1 << 7),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* With each packet command, we allocate a buffer of IDE_PC_BUFFER_SIZE bytes.
|
||||||
|
* This is used for several packet commands (not for READ/WRITE commands).
|
||||||
|
*/
|
||||||
|
#define IDE_PC_BUFFER_SIZE 256
|
||||||
|
|
||||||
struct ide_atapi_pc {
|
struct ide_atapi_pc {
|
||||||
/* actual packet bytes */
|
/* actual packet bytes */
|
||||||
u8 c[12];
|
u8 c[12];
|
||||||
|
@ -753,7 +759,7 @@ struct ide_atapi_pc {
|
||||||
* those are more or less driver-specific and some of them are subject
|
* those are more or less driver-specific and some of them are subject
|
||||||
* to change/removal later.
|
* to change/removal later.
|
||||||
*/
|
*/
|
||||||
u8 pc_buf[256];
|
u8 pc_buf[IDE_PC_BUFFER_SIZE];
|
||||||
|
|
||||||
/* idetape only */
|
/* idetape only */
|
||||||
struct idetape_bh *bh;
|
struct idetape_bh *bh;
|
||||||
|
@ -1113,6 +1119,8 @@ void ide_pktcmd_tf_load(ide_drive_t *, u32, u16, u8);
|
||||||
|
|
||||||
int ide_check_atapi_device(ide_drive_t *, const char *);
|
int ide_check_atapi_device(ide_drive_t *, const char *);
|
||||||
|
|
||||||
|
void ide_init_pc(struct ide_atapi_pc *);
|
||||||
|
|
||||||
ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc,
|
ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc,
|
||||||
ide_handler_t *handler, unsigned int timeout, ide_expiry_t *expiry,
|
ide_handler_t *handler, unsigned int timeout, ide_expiry_t *expiry,
|
||||||
void (*update_buffers)(ide_drive_t *, struct ide_atapi_pc *),
|
void (*update_buffers)(ide_drive_t *, struct ide_atapi_pc *),
|
||||||
|
|
Loading…
Reference in New Issue