Commit bd10a5f3 authored by Denis Efremov's avatar Denis Efremov
Browse files

floppy: add defines for sizes of cmd & reply buffers of floppy_raw_cmd

Use FD_RAW_CMD_SIZE, FD_RAW_REPLY_SIZE defines instead of magic numbers
for cmd & reply buffers of struct floppy_raw_cmd. Remove local to
floppy.c MAX_REPLIES define, as it is now FD_RAW_REPLY_SIZE.
FD_RAW_CMD_FULLSIZE added as we allow command to also fill reply_count
and reply fields.

Link: https://lore.kernel.org/r/20200501134416.72248-4-efremov@linux.com


Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
Signed-off-by: default avatarDenis Efremov <efremov@linux.com>
parent 9c4c5a24
Loading
Loading
Loading
Loading
+5 −14
Original line number Diff line number Diff line
@@ -337,8 +337,7 @@ static bool initialized;
/*
 * globals used by 'result()'
 */
#define MAX_REPLIES 16
static unsigned char reply_buffer[MAX_REPLIES];
static unsigned char reply_buffer[FD_RAW_REPLY_SIZE];
static int inr;		/* size of reply buffer, when called from interrupt */
#define ST0		0
#define ST1		1
@@ -1162,7 +1161,7 @@ static int result(int fdc)
	int i;
	int status = 0;

	for (i = 0; i < MAX_REPLIES; i++) {
	for (i = 0; i < FD_RAW_REPLY_SIZE; i++) {
		status = wait_til_ready(fdc);
		if (status < 0)
			break;
@@ -3079,7 +3078,7 @@ static void raw_cmd_done(int flag)
		raw_cmd->flags |= FD_RAW_HARDFAILURE;
	} else {
		raw_cmd->reply_count = inr;
		if (raw_cmd->reply_count > MAX_REPLIES)
		if (raw_cmd->reply_count > FD_RAW_REPLY_SIZE)
			raw_cmd->reply_count = 0;
		for (i = 0; i < raw_cmd->reply_count; i++)
			raw_cmd->reply[i] = reply_buffer[i];
@@ -3190,18 +3189,10 @@ loop:
	if (ret)
		return -EFAULT;
	param += sizeof(struct floppy_raw_cmd);
	if (ptr->cmd_count > 33)
			/* the command may now also take up the space
			 * initially intended for the reply & the
			 * reply count. Needed for long 82078 commands
			 * such as RESTORE, which takes ... 17 command
			 * bytes. Murphy's law #137: When you reserve
			 * 16 bytes for a structure, you'll one day
			 * discover that you really need 17...
			 */
	if (ptr->cmd_count > FD_RAW_CMD_FULLSIZE)
		return -EINVAL;

	for (i = 0; i < 16; i++)
	for (i = 0; i < FD_RAW_REPLY_SIZE; i++)
		ptr->reply[i] = 0;
	ptr->resultcode = 0;

+12 −2
Original line number Diff line number Diff line
@@ -360,10 +360,20 @@ struct floppy_raw_cmd {
	int buffer_length; /* length of allocated buffer */

	unsigned char rate;

#define FD_RAW_CMD_SIZE 16
#define FD_RAW_REPLY_SIZE 16
#define FD_RAW_CMD_FULLSIZE (FD_RAW_CMD_SIZE + 1 + FD_RAW_REPLY_SIZE)

	/* The command may take up the space initially intended for the reply
	 * and the reply count. Needed for long 82078 commands such as RESTORE,
	 * which takes 17 command bytes.
	 */

	unsigned char cmd_count;
	unsigned char cmd[16];
	unsigned char cmd[FD_RAW_CMD_SIZE];
	unsigned char reply_count;
	unsigned char reply[16];
	unsigned char reply[FD_RAW_REPLY_SIZE];
	int track;
	int resultcode;