Skip to contentSkip to conversation

Staging: silabs si4455 serial driver: fix directory structure and coding style

PATCH In review József Horváth 3 participants 3 messages Dec 10, 2020

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/2 Staging: silabs si4455 serial driver: fix directory structure and coding style

fix: coding style
fix: error checking
remove: doc silabs,si4455.txt

---
 .../bindings/staging/serial/silabs,si4455.txt |  39 -
 MAINTAINERS                                   |   7 +
 drivers/staging/Kconfig                       |   2 -
 drivers/staging/Makefile                      |   1 -
 drivers/tty/serial/Kconfig                    |   8 +
 drivers/tty/serial/Makefile                   |   1 +
 .../{staging/si4455 => tty/serial}/si4455.c   | 956 ++++++++----------
 .../si4455 => tty/serial}/si4455_api.h        |   0
 8 files changed, 419 insertions(+), 595 deletions(-)
 delete mode 100644 Documentation/devicetree/bindings/staging/serial/silabs,si4455.txt
 rename drivers/{staging/si4455 => tty/serial}/si4455.c (57%)
 rename drivers/{staging/si4455 => tty/serial}/si4455_api.h (100%)
Documentation/devicetree/bindings/staging/serial/silabs,si4455.txt deleted +0 -39
deleted file mode 100644
index abd659b7b952..000000000000
@@ -1,39 +0,0 @@
-* Silicon Labs Si4455 EASY-TO-USE, LOW-CURRENT OOK/(G)FSK SUB-GHZ TRANSCEIVER
-
-Required properties:
-- compatible: Should be one of the following:
-  - "silabs,si4455" for Silicon Labs Si4455-B1A or Si4455-C2A (driver automatically detects the part info),
-  - "silabs,si4455b1a" for Silicon Labs Si4455-B1A,
-  - "silabs,si4455c2a" for Silicon Labs Si4455-C2A,
-- reg: SPI chip select number.
-- interrupts: Specifies the interrupt source of the parent interrupt
-  controller. The format of the interrupt specifier depends on the
-  parent interrupt controller.
-- clocks: phandle to the IC source clock (only external clock source supported).
-- spi-max-frequency: maximum clock frequency on SPI port
-- shdn-gpios: gpio pin for SDN
-
-Example:
-
-/ {
-	clocks {
-                si4455_1_2_osc: si4455_1_2_osc {
-                        compatible = "fixed-clock";
-                        #clock-cells = <0>;
-                        clock-frequency  = <30000000>;
-                };
-	};
-};
-
-&spi0 {
-	si4455: si4455@0 {
-		compatible = "silabs,si4455";
-		reg = <0>;
-		clocks = <&si4455_1_2_osc>;
-		interrupt-parent = <&gpio>;
-		interrupts = <7 IRQ_TYPE_LEVEL_LOW>;
-                shdn-gpios = <&gpio 26 1>;
-                status = "okay";
-                spi-max-frequency = <3000000>;
-	};
-};
MAINTAINERS +7 -0
index 2ac5688db43a..a29bc17d446d 100644
@@ -15934,6 +15934,13 @@ S:	Maintained
 F:	drivers/input/touchscreen/silead.c
 F:	drivers/platform/x86/touchscreen_dmi.c
 
+SILICON LABS SI4455 SERIAL DRIVER
+M:	József Horváth <[email protected]>
+S:	Maintained
+F:	Documentation/devicetree/bindings/staging/serial/silabs,si4455.txt
+F:	drivers/tty/serial/si4455.c
+F:	drivers/tty/serial/si4455_api.h
+
 SILICON LABS WIRELESS DRIVERS (for WFxxx series)
 M:	Jérôme Pouiller <[email protected]>
 S:	Supported
drivers/staging/Kconfig +0 -2
index 2cf0c9bfe878..9b7cb7c5766a 100644
@@ -118,6 +118,4 @@ source "drivers/staging/wfx/Kconfig"
 
 source "drivers/staging/hikey9xx/Kconfig"
 
-source "drivers/staging/si4455/Kconfig"
-
 endif # STAGING
drivers/staging/Makefile +0 -1
index 043c63287bc6..38226737c9f3 100644
@@ -49,4 +49,3 @@ obj-$(CONFIG_QLGE)		+= qlge/
 obj-$(CONFIG_WIMAX)		+= wimax/
 obj-$(CONFIG_WFX)		+= wfx/
 obj-y				+= hikey9xx/
-obj-$(CONFIG_SERIAL_SI4455)	+= si4455/
drivers/tty/serial/Kconfig +8 -0
index 28f22e58639c..560aa311cd03 100644
@@ -1583,6 +1583,14 @@ config SERIAL_MILBEAUT_USIO_CONSOLE
 	  receives all kernel messages and warnings and which allows logins in
 	  single user mode).
 
+config SERIAL_SI4455
+	tristate "Si4455 support"
+	depends on SPI
+	select SERIAL_CORE
+	help
+	  This driver is for Silicon Labs's Si4455 Sub-GHz transciver.
+	  Say 'Y' here if you wish to use it as serial port.
+
 endmenu
 
 config SERIAL_MCTRL_GPIO
drivers/tty/serial/Makefile +1 -0
index caf167f0c10a..94f8a727b2a1 100644
@@ -96,3 +96,4 @@ obj-$(CONFIG_SERIAL_MCTRL_GPIO)	+= serial_mctrl_gpio.o
 
 obj-$(CONFIG_SERIAL_KGDB_NMI) += kgdb_nmi.o
 obj-$(CONFIG_KGDB_SERIAL_CONSOLE) += kgdboc.o
+obj-$(CONFIG_SERIAL_SI4455) += si4455.o
drivers/tty/serial/si4455.c renamed from drivers/staging/si4455/si4455.c +403 -553

1,357 lines not on this page · raw message

drivers/tty/serial/si4455_api.h renamed from drivers/staging/si4455/si4455_api.h +0 -0
similarity index 100%
rename from drivers/staging/si4455/si4455_api.h
rename to drivers/tty/serial/si4455_api.h
Signature · 1 line
2.17.1
#1 lore raw
Quoted 3 lines · József Horváth

fix: coding style
fix: error checking
remove: doc silabs,si4455.txt

What does all of this mean?

Please read the documentation for how to write an effective changelog text, and where to put the "changes from the first version" text at.

thanks,

greg k-h

#2 lore raw
In reply to József Horváth
Quoted 5 lines · József Horváth

fix: coding style
fix: error checking
remove: doc silabs,si4455.txt

Just fold (combine) this check in with the first. This is much better but there are still 54 checkpatch warnins.

total: 0 errors, 2 warnings, 52 checks, 1311 lines checked

This is much better. Do we have to print so many warnings? It's useful for debugging but it makes the code messy. The ioctl still has some security issues with regards to user pointers (see bottom).

Quoted 5 lines

struct si4455_part_info {

drivers/tty/serial/si4455.c renamed from drivers/staging/si4455/si4455.c +0 -4
-	u8				CHIPREV;
-	u16				PART;
-	u8				PBUILD;
-	u16				ID;

drivers/tty/serial/si4455.c line 70

Quoted 10 lines
drivers/tty/serial/si4455.c renamed from drivers/staging/si4455/si4455.c +7 -3
-	u8				CUSTOMER;
-	u8				ROMID;
-	u8				BOND;
+	u8 CHIPREV;
+	u16 PART;
+	u8 PBUILD;
+	u16 ID;
+	u8 CUSTOMER;
+	u8 ROMID;
+	u8 BOND;

Make these lower case letters.

Quoted 12 lines

static int si4455_get_response(struct uart_port *port,

drivers/tty/serial/si4455.c renamed from drivers/staging/si4455/si4455.c +0 -8
 				int length,
 				u8 *data)
 {
-	int ret = -EIO;
-	u8 dataOut[] = { SI4455_CMD_ID_READ_CMD_BUFF };
-	u8 *dataIn = devm_kzalloc(port->dev, 1 + length, GFP_KERNEL);
-	struct spi_transfer xfer[] = {
-		{
-			.tx_buf = dataOut,
-			.len = sizeof(dataOut),
-		}, {

drivers/tty/serial/si4455.c static struct uart_driver si4455_uart = { · line 143

Quoted 10 lines
drivers/tty/serial/si4455.c renamed from drivers/staging/si4455/si4455.c +5 -5
-			.rx_buf = dataIn,
-			.len = 1 + length,
-		}
-	};
-	int errCnt = 10000;
+	int ret;
+	u8 data_out[] = { SI4455_CMD_ID_READ_CMD_BUFF };
+	u8 *data_in = NULL;
+	struct spi_transfer xfer[2];
+	int err = 10000;

Use "cnt" instead of "err" otherwise people will get confused and start saying "err = some_function();"

Quoted 28 lines
drivers/tty/serial/si4455.c renamed from drivers/staging/si4455/si4455.c +13 -11
-	while (errCnt > 0) {
-		dataOut[0] = SI4455_CMD_ID_READ_CMD_BUFF;
+	data_in = kzalloc(1 + length, GFP_KERNEL);
+	if (!data_in)
+		return -ENOMEM;
+
+	memset(&xfer, 0x00, sizeof(xfer));
+	xfer[0].tx_buf = data_out;
+	xfer[0].len = sizeof(data_out);
+	xfer[1].rx_buf = data_in;
+	xfer[1].len = 1 + length;
+
+	while (--err > 0) {
+		data_out[0] = SI4455_CMD_ID_READ_CMD_BUFF;
 		ret = spi_sync_transfer(to_spi_device(port->dev),
 					xfer,
 					ARRAY_SIZE(xfer));
-		if (ret == 0) {
-			if (dataIn[0] == 0xFF) {
-				if ((length > 0) && (data != NULL)) {
-					memcpy(data, &dataIn[1], length);
-				} else {
-					if (length > 0)
-						ret = -EINVAL;
-				}
-				break;
+		if (ret) {

drivers/tty/serial/si4455.c static struct uart_driver si4455_uart = { · line 170

Quoted 10 lines
drivers/tty/serial/si4455.c renamed from drivers/staging/si4455/si4455.c +10 -0
+			dev_err(port->dev, "%s: spi_sync_transfer error(%i)", __func__, ret);
+			break;
+		}
+
+		if (data_in[0] == 0xFF) {
+			if (length > 0 && data) {
+				memcpy(data, &data_in[1], length);
+			} else {
+				if (length > 0)
+					ret = -EINVAL;

Should this break if we encounter an error?

Quoted 37 lines
drivers/tty/serial/si4455.c renamed from drivers/staging/si4455/si4455.c +9 -12
 			}
-			usleep_range(100, 200);
-		} else {
 			break;
 		}
-		errCnt--;
+		usleep_range(100, 200);
 	}
-	if (errCnt == 0) {
-		dev_err(port->dev, "si4455_poll_cts:errCnt==%i", errCnt);
+	if (err == 0) {
+		dev_err(port->dev, "%s:err==%i", __func__, err);
 		ret = -EIO;
 	}
-	if (dataIn != NULL)
-		devm_kfree(port->dev, dataIn);
+	kfree(data_in);
 	return ret;
 }
 
+static int si4455_poll_cts(struct uart_port *port)
+{
+	return si4455_get_response(port, 0, NULL);
+}
+
 static int si4455_send_command(struct uart_port *port,
 				int length,
 				u8 *data)
@@ -214,134 +193,118 @@ static int si4455_send_command(struct uart_port *port,
 	int ret;
 
 	ret = si4455_poll_cts(port);
-	if (ret == 0) {
-		ret = spi_write(to_spi_device(port->dev), data, length);
-		if (ret) {
-			dev_err(port->dev,
-				"%s: spi_write error(%i)",

drivers/tty/serial/si4455.c static int si4455_send_command(struct uart_port *port, · line 199

Quoted 10 lines
drivers/tty/serial/si4455.c renamed from drivers/staging/si4455/si4455.c +2 -6
-				__func__,
-				ret);
-		}
-	} else {
-		dev_err(port->dev,
-			"%s: si4455_poll_cts error(%i)",
+	if (ret) {
+		dev_err(port->dev, "%s: si4455_poll_cts error(%i)",
 			__func__,
 			ret);

This can fit in two lines.

		dev_err(port->dev, "%s: si4455_poll_cts error(%i)", __func__,
			ret);
Quoted 199 lines
drivers/tty/serial/si4455.c renamed from drivers/staging/si4455/si4455.c +60 -83
+		return ret;
+	}
+	ret = spi_write(to_spi_device(port->dev), data, length);
+	if (ret) {
+		dev_err(port->dev,
+			"%s: spi_write error(%i)", __func__, ret);
 	}
 	return ret;
 }
 
 static int si4455_send_command_get_response(struct uart_port *port,
-						int outLength,
-						u8 *outData,
-						int inLength,
-						u8 *inData)
+						int out_length,
+						u8 *data_out,
+						int in_length,
+						u8 *data_in)
 {
 	int ret;
 
-	ret = si4455_send_command(port, outLength, outData);
-	if (!ret) {
-		ret = si4455_get_response(port, inLength, inData);
-	} else {
-		dev_err(port->dev,
-			"%s: si4455_send_command error(%i)",
-			__func__,
-			ret);
+	ret = si4455_send_command(port, out_length, data_out);
+	if (ret) {
+		dev_err(port->dev, "%s: si4455_send_command error(%i)",
+			__func__, ret);
+		return ret;
 	}
+
+	ret = si4455_get_response(port, in_length, data_in);
+
 	return ret;
 }
 
 static int si4455_read_data(struct uart_port *port,
 				u8 command,
-				int pollCts,
+				int poll,
 				int length,
 				u8 *data)
 {
 	int ret = 0;
-	u8 dataOut[] = { command };
+	u8 data_out[] = { command };
 	struct spi_transfer xfer[] = {
 		{
-			.tx_buf = dataOut,
-			.len = sizeof(dataOut),
+			.tx_buf = data_out,
+			.len = sizeof(data_out),
 		}, {
 			.rx_buf = data,
 			.len = length,
 		}
 	};
 
-	if (pollCts)
+	if (poll) {
 		ret = si4455_poll_cts(port);
+		if (ret)
+			return ret;
+	}
 
-	if (ret == 0) {
-		ret = spi_sync_transfer(to_spi_device(port->dev),
-					xfer,
-					ARRAY_SIZE(xfer));
-		if (ret) {
-			dev_err(port->dev,
-				"%s: spi_sync_transfer error(%i)",
-				__func__,
-				ret);
-		}
+	ret = spi_sync_transfer(to_spi_device(port->dev),
+				xfer,
+				ARRAY_SIZE(xfer));
+	if (ret) {
+		dev_err(port->dev, "%s: spi_sync_transfer error(%i)",
+			__func__,
+			ret);
 	}
 	return ret;
 }
 
 static int si4455_write_data(struct uart_port *port,
 				u8 command,
-				int pollCts,
+				int poll,
 				int length,
 				u8 *data)
 {
 	int ret = 0;
-	u8 *dataOut = NULL;
+	u8 *data_out;
 
-	if (pollCts)
+	if (poll) {
 		ret = si4455_poll_cts(port);
+		if (ret)
+			return ret;
+	}
 
-	if (ret == 0) {
-		dataOut = devm_kzalloc(port->dev, 1 + length, GFP_KERNEL);
-		if (dataOut != NULL) {
-			dataOut[0] = command;
-			memcpy(&dataOut[1], data, length);
-			ret = spi_write(to_spi_device(port->dev),
-					dataOut,
-					1 + length);
-			if (ret) {
-				dev_err(port->dev,
-					"%s: spi_write error(%i)",
-					__func__,
-					ret);
-			}
-		} else {
-			dev_err(port->dev,
-				"%s: devm_kzalloc error",
-				__func__);
-			ret = -ENOMEM;
-		}
+	data_out = kzalloc(1 + length, GFP_KERNEL);
+	if (!data_out)
+		return -ENOMEM;
+
+	data_out[0] = command;
+	memcpy(&data_out[1], data, length);
+	ret = spi_write(to_spi_device(port->dev), data_out, 1 + length);
+	if (ret) {
+		dev_err(port->dev, "%s: spi_write error(%i)",
+			__func__, ret);
 	}
-	if (dataOut != NULL)
-		devm_kfree(port->dev, dataOut);
+	kfree(data_out);
 
 	return ret;
 }
 
-static int si4455_poll_cts(struct uart_port *port)
-{
-	return si4455_get_response(port, 0, NULL);
-}
-
 static void si4455_set_power(struct si4455_port *priv,
 				int on)
 {
-	if (priv->shdn_gpio) {
-		if (on) {
-			gpiod_direction_output(priv->shdn_gpio, 0);
-			usleep_range(4000, 5000);
-			gpiod_set_value(priv->shdn_gpio, 1);
-			usleep_range(4000, 5000);
-		} else {
-			gpiod_direction_output(priv->shdn_gpio, 0);
-		}
+	if (!priv->shdn_gpio)
+		return;
+	if (on) {
+		gpiod_direction_output(priv->shdn_gpio, 0);
+		usleep_range(4000, 5000);
+		gpiod_set_value(priv->shdn_gpio, 1);
+		usleep_range(4000, 5000);
+	} else {
+		gpiod_direction_output(priv->shdn_gpio, 0);
 	}
 }
 
@@ -363,27 +326,23 @@ static int si4455_get_part_info(struct uart_port *port,
 				struct si4455_part_info *result)
 {
 	int ret;
-	u8 dataOut[] = { SI4455_CMD_ID_PART_INFO };
-	u8 dataIn[SI4455_CMD_REPLY_COUNT_PART_INFO];
-
-	ret = si4455_send_command_get_response(port,
-						sizeof(dataOut),
-						dataOut,
-						sizeof(dataIn),
-						dataIn);
-	if (ret == 0) {
-		result->CHIPREV = dataIn[0];
-		memcpy(&result->PART, &dataIn[1], sizeof(result->PART));
-		result->PBUILD = dataIn[3];
-		memcpy(&result->ID, &dataIn[4], sizeof(result->ID));
-		result->CUSTOMER = dataIn[6];
-		result->ROMID = dataIn[7];
-		result->BOND = dataIn[8];
-	} else {
+	u8 data_out[] = { SI4455_CMD_ID_PART_INFO };

drivers/tty/serial/si4455.c static int si4455_get_part_info(struct uart_port *port, · line 337

Quoted 10 lines
drivers/tty/serial/si4455.c renamed from drivers/staging/si4455/si4455.c +6 -2
+	u8 data_in[SI4455_CMD_REPLY_COUNT_PART_INFO];
+
+	ret = si4455_send_command_get_response(port, sizeof(data_out), data_out,
+					       sizeof(data_in), data_in);
+	if (ret) {
 		dev_err(port->dev,
 			"%s: si4455_send_command_get_response error(%i)",
-			__func__,
-			ret);
+			__func__, ret);

return ret;

drivers/tty/serial/si4455.c static int si4455_get_part_info(struct uart_port *port, · line 345

Quoted 8 lines
drivers/tty/serial/si4455.c renamed from drivers/staging/si4455/si4455.c +8 -0
+	} else {
+		result->CHIPREV = data_in[0];
+		memcpy(&result->PART, &data_in[1], sizeof(result->PART));
+		result->PBUILD = data_in[3];
+		memcpy(&result->ID, &data_in[4], sizeof(result->ID));
+		result->CUSTOMER = data_in[6];
+		result->ROMID = data_in[7];
+		result->BOND = data_in[8];

Then you can pull these lines in one tab. Ideally, the success path is indented one tab and the error path is indented two tabs.

Quoted 336 lines
drivers/tty/serial/si4455.c renamed from drivers/staging/si4455/si4455.c +103 -148
 	}
 	return ret;
 }
@@ -395,33 +354,29 @@ static int si4455_get_int_status(struct uart_port *port,
 					struct si4455_int_status *result)
 {
 	int ret;
-	u8 dataOut[] = {
+	u8 data_out[] = {
 		SI4455_CMD_ID_GET_INT_STATUS,
 		phClear,
 		modemClear,
 		chipClear
 	};
-	u8 dataIn[SI4455_CMD_REPLY_COUNT_GET_INT_STATUS];
+	u8 data_in[SI4455_CMD_REPLY_COUNT_GET_INT_STATUS];
 
-	ret = si4455_send_command_get_response(port,
-						sizeof(dataOut),
-						dataOut,
-						sizeof(dataIn),
-						dataIn);
-	if (ret == 0) {
-		result->INT_PEND       = dataIn[0];
-		result->INT_STATUS     = dataIn[1];
-		result->PH_PEND        = dataIn[2];
-		result->PH_STATUS      = dataIn[3];
-		result->MODEM_PEND     = dataIn[4];
-		result->MODEM_STATUS   = dataIn[5];
-		result->CHIP_PEND      = dataIn[6];
-		result->CHIP_STATUS    = dataIn[7];
-	} else {
+	ret = si4455_send_command_get_response(port, sizeof(data_out), data_out,
+					       sizeof(data_in), data_in);
+	if (ret) {
 		dev_err(port->dev,
 			"%s: si4455_send_command_get_response error(%i)",
-			__func__,
-			ret);
+			__func__, ret);
+	} else {
+		result->INT_PEND       = data_in[0];
+		result->INT_STATUS     = data_in[1];
+		result->PH_PEND        = data_in[2];
+		result->PH_STATUS      = data_in[3];
+		result->MODEM_PEND     = data_in[4];
+		result->MODEM_STATUS   = data_in[5];
+		result->CHIP_PEND      = data_in[6];
+		result->CHIP_STATUS    = data_in[7];
 	}
 	return ret;
 }
@@ -431,32 +386,27 @@ static int si4455_get_modem_status(struct uart_port *port,
 					struct si4455_modem_status *result)
 {
 	int ret;
-	u8 dataOut[] = {
+	u8 data_out[] = {
 		SI4455_CMD_ID_GET_MODEM_STATUS,
 		modemClear,
 	};
-	u8 dataIn[SI4455_CMD_REPLY_COUNT_GET_MODEM_STATUS];
+	u8 data_in[SI4455_CMD_REPLY_COUNT_GET_MODEM_STATUS];
 
-	ret = si4455_send_command_get_response(port,
-						sizeof(dataOut),
-						dataOut,
-						sizeof(dataIn),
-						dataIn);
-	if (ret == 0) {
-		result->MODEM_PEND      = dataIn[0];
-		result->MODEM_STATUS    = dataIn[1];
-		result->CURR_RSSI       = dataIn[2];
-		result->LATCH_RSSI      = dataIn[3];
-		result->ANT1_RSSI       = dataIn[4];
-		result->ANT2_RSSI       = dataIn[5];
-		memcpy(&result->AFC_FREQ_OFFSET,
-			&dataIn[6],
-			sizeof(result->AFC_FREQ_OFFSET));
-	} else {
+	ret = si4455_send_command_get_response(port, sizeof(data_out), data_out,
+					       sizeof(data_in), data_in);
+	if (ret) {
 		dev_err(port->dev,
 			"%s: si4455_send_command_get_response error(%i)",
-			__func__,
-			ret);
+			__func__, ret);
+	} else {
+		result->MODEM_PEND      = data_in[0];
+		result->MODEM_STATUS    = data_in[1];
+		result->CURR_RSSI       = data_in[2];
+		result->LATCH_RSSI      = data_in[3];
+		result->ANT1_RSSI       = data_in[4];
+		result->ANT2_RSSI       = data_in[5];
+		memcpy(&result->AFC_FREQ_OFFSET,
+		       &data_in[6], sizeof(result->AFC_FREQ_OFFSET));
 	}
 	return ret;
 }
@@ -465,25 +415,21 @@ static int si4455_fifo_info(struct uart_port *port,
 				u8 fifo,
 				struct si4455_fifo_info *result)
 {
-	int ret = 0;
-	u8 dataOut[SI4455_CMD_ARG_COUNT_FIFO_INFO] = {
+	int ret;
+	u8 data_out[SI4455_CMD_ARG_COUNT_FIFO_INFO] = {
 		SI4455_CMD_ID_FIFO_INFO, fifo
 	};
-	u8 dataIn[SI4455_CMD_REPLY_COUNT_FIFO_INFO] = { 0 };
+	u8 data_in[SI4455_CMD_REPLY_COUNT_FIFO_INFO] = { 0 };
 
-	ret = si4455_send_command_get_response(port,
-						sizeof(dataOut),
-						dataOut,
-						sizeof(dataIn),
-						dataIn);
-	if (ret == 0) {
-		result->RX_FIFO_COUNT  = dataIn[0];
-		result->TX_FIFO_SPACE  = dataIn[1];
-	} else {
+	ret = si4455_send_command_get_response(port, sizeof(data_out), data_out,
+					       sizeof(data_in), data_in);
+	if (ret) {
 		dev_err(port->dev,
 			"%s: si4455_send_command_get_response error(%i)",
-			__func__,
-			ret);
+			__func__, ret);
+	} else {
+		result->RX_FIFO_COUNT  = data_in[0];
+		result->TX_FIFO_SPACE  = data_in[1];
 	}
 	return ret;
 }
@@ -492,10 +438,7 @@ static int si4455_read_rx_fifo(struct uart_port *port,
 				int length,
 				u8 *data)
 {
-	return si4455_read_data(port,
-				SI4455_CMD_ID_READ_RX_FIFO,
-				0,
-				length,
+	return si4455_read_data(port, SI4455_CMD_ID_READ_RX_FIFO, 0, length,
 				data);
 }
 
@@ -503,35 +446,31 @@ static int si4455_write_tx_fifo(struct uart_port *port,
 				int length,
 				u8 *data)
 {
-	return si4455_write_data(port,
-					SI4455_CMD_ID_WRITE_TX_FIFO,
-					0,
-					length,
-					data);
+	return si4455_write_data(port, SI4455_CMD_ID_WRITE_TX_FIFO, 0, length,
+				data);
 }
 
 static int si4455_rx(struct uart_port *port,
 			u32 channel,
 			u8 condition,
 			u16 length,
-			u8 nextState1,
-			u8 nextState2,
-			u8 nextState3)
+			u8 next_state1,
+			u8 next_state2,
+			u8 next_state3)
 {
-	u8 dataOut[SI4455_CMD_ARG_COUNT_START_RX];
-
-	dataOut[0] = SI4455_CMD_ID_START_RX;
-	dataOut[1] = channel;
-	dataOut[2] = condition;
-	dataOut[3] = (u8)(length >> 8);
-	dataOut[4] = (u8)(length);
-	dataOut[5] = nextState1;
-	dataOut[6] = nextState2;
-	dataOut[7] = nextState3;
-
-	return si4455_send_command(port,
-					SI4455_CMD_ARG_COUNT_START_RX,
-					dataOut);
+	u8 data_out[SI4455_CMD_ARG_COUNT_START_RX];
+
+	data_out[0] = SI4455_CMD_ID_START_RX;
+	data_out[1] = channel;
+	data_out[2] = condition;
+	data_out[3] = (u8)(length >> 8);
+	data_out[4] = (u8)(length);
+	data_out[5] = next_state1;
+	data_out[6] = next_state2;
+	data_out[7] = next_state3;
+
+	return si4455_send_command(port, SI4455_CMD_ARG_COUNT_START_RX,
+					data_out);
 }
 
 static int si4455_tx(struct uart_port *port,
@@ -539,31 +478,29 @@ static int si4455_tx(struct uart_port *port,
 			u8 condition,
 			u16 length)
 {
-	u8 dataOut[/*6*/ SI4455_CMD_ARG_COUNT_START_TX];
-
-	dataOut[0] = SI4455_CMD_ID_START_TX;
-	dataOut[1] = channel;
-	dataOut[2] = condition;
-	dataOut[3] = (u8)(length >> 8);
-	dataOut[4] = (u8)(length);
-	/*TODO: radioCmd[5] = 0x44; in case of rev c2a*/
-
-	return si4455_send_command(port,
-					/*6*/ SI4455_CMD_ARG_COUNT_START_TX,
-					dataOut);
+	u8 data_out[/*6*/ SI4455_CMD_ARG_COUNT_START_TX];
+
+	data_out[0] = SI4455_CMD_ID_START_TX;
+	data_out[1] = channel;
+	data_out[2] = condition;
+	data_out[3] = (u8)(length >> 8);
+	data_out[4] = (u8)(length);
+	/*TODO: data_out[5] = 0x44; in case of rev c2a*/
+
+	return si4455_send_command(port, /*6*/ SI4455_CMD_ARG_COUNT_START_TX,
+					data_out);
 }
 
 static int si4455_change_state(struct uart_port *port,
-				u8 nextState1)
+				u8 next_state1)
 {
-	u8 dataOut[SI4455_CMD_ARG_COUNT_CHANGE_STATE];
+	u8 data_out[SI4455_CMD_ARG_COUNT_CHANGE_STATE];
 
-	dataOut[0] = SI4455_CMD_ID_CHANGE_STATE;
-	dataOut[1] = (u8)nextState1;
+	data_out[0] = SI4455_CMD_ID_CHANGE_STATE;
+	data_out[1] = (u8)next_state1;
 
-	return si4455_send_command(port,
-					SI4455_CMD_ARG_COUNT_CHANGE_STATE,
-					dataOut);
+	return si4455_send_command(port, SI4455_CMD_ARG_COUNT_CHANGE_STATE,
+					data_out);
 }
 
 static int si4455_begin_tx(struct uart_port *port,
@@ -572,88 +509,66 @@ static int si4455_begin_tx(struct uart_port *port,
 				u8 *data)
 {
 	int ret = 0;
-	struct si4455_int_status intStatus = { 0 };
-	struct si4455_fifo_info fifoInfo = { 0 };
+	struct si4455_int_status int_status = { 0 };
+	struct si4455_fifo_info fifo_info = { 0 };
 
 	dev_dbg(port->dev, "%s(%u, %u)", __func__, channel, length);
 	if ((length > SI4455_FIFO_SIZE) || (length < 0))
-		ret = -EINVAL;
+		return -EINVAL;
 
-	if (ret == 0) {
-		ret = si4455_change_state(port,
-			SI4455_CMD_CHANGE_STATE_ARG_NEW_STATE_ENUM_READY);
-		if (ret) {
-			dev_err(port->dev,
-				"%s: si4455_change_state error(%i)",
-				__func__,
-				ret);
-			goto end;
-		}
-		ret = si4455_get_int_status(port, 0, 0, 0, &intStatus);
-		if (ret) {
-			dev_err(port->dev,
-				"%s: si4455_get_int_status error(%i)",
-				__func__,
-				ret);
-			goto end;
-		}
-		ret = si4455_fifo_info(port,
-					SI4455_CMD_FIFO_INFO_ARG_TX_BIT,
-					&fifoInfo);
-		if (ret) {
-			dev_err(port->dev,
-				"%s: si4455_fifo_info error(%i)",
-				__func__,
-				ret);
-			goto end;
-		}
-		ret = si4455_write_tx_fifo(port, (u16)length, data);
-		if (ret) {
-			dev_err(port->dev,
-				"%s: si4455_write_tx_fifo error(%i)",
-				__func__,
-				ret);
-			goto end;
-		}
-		ret = si4455_tx(port,
-				(u8)channel,
-				0x30,
-				(u16)length);
-		if (ret) {
-			dev_err(port->dev,
-				"%s: si4455_tx error(%i)",
-				__func__,
-				ret);
-			goto end;
-		}
+	ret = si4455_change_state(port,
+				  SI4455_CMD_CHANGE_STATE_STATE_READY);
+	if (ret) {
+		dev_err(port->dev, "%s: si4455_change_state error(%i)",
+			__func__, ret);
+		return ret;
+	}
+	ret = si4455_get_int_status(port, 0, 0, 0, &int_status);
+	if (ret) {
+		dev_err(port->dev, "%s: si4455_get_int_status error(%i)",
+			__func__, ret);
+		return ret;
+	}
+	ret = si4455_fifo_info(port,
+			       SI4455_CMD_FIFO_INFO_ARG_TX_BIT, &fifo_info);
+	if (ret) {
+		dev_err(port->dev, "%s: si4455_fifo_info error(%i)",
+			__func__, ret);
+		return ret;
+	}
+	ret = si4455_write_tx_fifo(port, (u16)length, data);
+	if (ret) {
+		dev_err(port->dev, "%s: si4455_write_tx_fifo error(%i)",
+			__func__, ret);

drivers/tty/serial/si4455.c static int si4455_begin_tx(struct uart_port *port, · line 551

Quoted 10 lines
drivers/tty/serial/si4455.c renamed from drivers/staging/si4455/si4455.c +7 -1
+		return ret;
+	}
+	ret = si4455_tx(port, channel, 0x30, length);
+	if (ret) {
+		dev_err(port->dev, "%s: si4455_tx error(%i)",
+			__func__, ret);
+		return ret;
 	}
-end:
 	return ret;

This is now "return 0;" which is nice because it means you can see it is the success path.

Quoted 25 lines
drivers/tty/serial/si4455.c renamed from drivers/staging/si4455/si4455.c +6 -9
 }
 
 static int si4455_end_tx(struct uart_port *port)
 {
 	int ret = 0;
-	struct si4455_int_status intStatus = { 0 };
+	struct si4455_int_status int_status = { 0 };
 
 	ret = si4455_change_state(port,
-			SI4455_CMD_CHANGE_STATE_ARG_NEW_STATE_ENUM_READY);
+				  SI4455_CMD_CHANGE_STATE_STATE_READY);
 	if (ret) {
-		dev_err(port->dev,
-			"%s: si4455_change_state error(%i)",
-			__func__,
-			ret);
-		goto end;
+		dev_err(port->dev, "%s: si4455_change_state error(%i)",
+			__func__, ret);
+		return ret;
 	}
-	ret = si4455_get_int_status(port, 0, 0, 0, &intStatus);
+	ret = si4455_get_int_status(port, 0, 0, 0, &int_status);
 	if (ret) {
-		dev_err(port->dev,

drivers/tty/serial/si4455.c static int si4455_begin_tx(struct uart_port *port, · line 572

Quoted 10 lines
drivers/tty/serial/si4455.c renamed from drivers/staging/si4455/si4455.c +3 -5
-			"%s: si4455_get_int_status error(%i)",
-			__func__,
-			ret);
-		goto end;
+		dev_err(port->dev, "%s: si4455_get_int_status error(%i)",
+			__func__, ret);
+		return ret;
 	}
-end:
 	return ret;

return 0;

Quoted 50 lines
drivers/tty/serial/si4455.c renamed from drivers/staging/si4455/si4455.c +13 -18
 }
 
@@ -662,43 +577,36 @@ static int si4455_begin_rx(struct uart_port *port,
 				u32 length)
 {
 	int ret = 0;
-	struct si4455_int_status intStatus = { 0 };
-	struct si4455_fifo_info fifoInfo = { 0 };
+	struct si4455_int_status int_status = { 0 };
+	struct si4455_fifo_info fifo_info = { 0 };
 
 	dev_dbg(port->dev, "%s(%u, %u)", __func__, channel, length);
-	ret = si4455_get_int_status(port, 0, 0, 0, &intStatus);
+	ret = si4455_get_int_status(port, 0, 0, 0, &int_status);
 	if (ret) {
-		dev_err(port->dev,
-			"%s: si4455_get_int_status error(%i)",
-			__func__,
-			ret);
-		goto end;
+		dev_err(port->dev, "%s: si4455_get_int_status error(%i)",
+			__func__, ret);
+		return ret;
 	}
 	ret = si4455_fifo_info(port,
 				SI4455_CMD_FIFO_INFO_ARG_RX_BIT,
-				&fifoInfo);
+				&fifo_info);
 	if (ret) {
-		dev_err(port->dev,
-			"%s: si4455_fifo_info error(%i)",
-			__func__,
-			ret);
-		goto end;
+		dev_err(port->dev, "%s: si4455_fifo_info error(%i)",
+			__func__, ret);
+		return ret;
 	}
 	ret = si4455_rx(port,
 			channel,
 			0x00,
 			length,
-			SI4455_CMD_START_RX_ARG_RXTIMEOUT_STATE_ENUM_RX,
-			SI4455_CMD_START_RX_ARG_RXVALID_STATE_ENUM_RX,
-			SI4455_CMD_START_RX_ARG_RXINVALID_STATE_ENUM_RX);
+			SI4455_CMD_START_RX_RXTIMEOUT_STATE_RX,
+			SI4455_CMD_START_RX_RXVALID_STATE_RX,
+			SI4455_CMD_START_RX_RXINVALID_STATE_RX);
 	if (ret) {
-		dev_err(port->dev,

drivers/tty/serial/si4455.c static int si4455_begin_rx(struct uart_port *port, · line 610

Quoted 10 lines
drivers/tty/serial/si4455.c renamed from drivers/staging/si4455/si4455.c +3 -5
-			"%s: si4455_rx error(%i)",
-			__func__,
-			ret);
-		goto end;
+		dev_err(port->dev, "%s: si4455_rx error(%i)",
+			__func__, ret);
+		return ret;
 	}
-end:
 	return ret;

return 0;

Quoted 265 lines
drivers/tty/serial/si4455.c renamed from drivers/staging/si4455/si4455.c +54 -93
 }
 
@@ -710,59 +618,53 @@ static int si4455_end_rx(struct uart_port *port,
 }
 
 static int si4455_configure(struct uart_port *port,
-				u8 *configurationData)
+				u8 *configuration_data)
 {
 	int ret = 0;
 	u8 col;
 	u8 response;
-	u8 numOfBytes;
-	struct si4455_int_status intStatus = { 0 };
-	u8 radioCmd[16u];
+	u8 count;
+	struct si4455_int_status int_status = { 0 };
+	u8 radio_cmd[16u];
 
 	/* While cycle as far as the pointer points to a command */
-	while (*configurationData != 0x00) {
+	while (*configuration_data != 0x00) {
 		/* Commands structure in the array:
 		 * --------------------------------
 		 * LEN | <LEN length of data>
 		 */
-		numOfBytes = *configurationData++;
-		dev_dbg(port->dev,
-			"%s: numOfBytes(%u)",
-			__func__,
-			numOfBytes);
-		if (numOfBytes > 16u) {
+		count = *configuration_data++;
+		dev_dbg(port->dev, "%s: count(%u)",
+			__func__, count);
+		if (count > 16u) {
 			/* Initial configuration of Si4x55 */
 			if (SI4455_CMD_ID_WRITE_TX_FIFO
-				 == *configurationData) {
-				if (numOfBytes > 128u) {
+				 == *configuration_data) {
+				if (count > 128u) {
 					/* Number of command bytes exceeds
 					 * maximal allowable length
 					 */
-					dev_err(port->dev,
-						"%s: command length error(%i)",
-						__func__,
-						numOfBytes);
+					dev_err(port->dev, "%s: command length error(%i)",
+						__func__, count);
 					ret = -EINVAL;
 					break;
 				}
 
 				/* Load array to the device */
-				configurationData++;
+				configuration_data++;
 				ret = si4455_write_data(port,
 						SI4455_CMD_ID_WRITE_TX_FIFO,
 						1,
-						numOfBytes - 1,
-						configurationData);
+						count - 1,
+						configuration_data);
 				if (ret) {
-					dev_err(port->dev,
-						"%s: si4455_write_data error(%i)",
-						__func__,
-						ret);
+					dev_err(port->dev, "%s: si4455_write_data error(%i)",
+						__func__, ret);
 					break;
 				}
 
 				/* Point to the next command */
-				configurationData += numOfBytes - 1;
+				configuration_data += count - 1;
 
 				/* Continue command interpreter */
 				continue;
@@ -775,52 +677,41 @@ static int si4455_configure(struct uart_port *port,
 			}
 		}
 
-		for (col = 0u; col < numOfBytes; col++) {
-			radioCmd[col] = *configurationData;
-			configurationData++;
+		for (col = 0u; col < count; col++) {
+			radio_cmd[col] = *configuration_data;
+			configuration_data++;
 		}
 
-		dev_dbg(port->dev,
-			"%s: radioCmd[0](%u)",
-			__func__,
-			radioCmd[0]);
-		ret = si4455_send_command_get_response(port,
-							numOfBytes,
-							radioCmd,
-							1,
-							&response);
+		dev_dbg(port->dev, "%s: radio_cmd[0](%u)", __func__, radio_cmd[0]);
+		ret = si4455_send_command_get_response(port, count, radio_cmd,
+						       1, &response);
 		if (ret) {
 			dev_err(port->dev,
 				"%s: si4455_send_command_get_response error(%i)",
-				__func__,
-				ret);
+				__func__, ret);
 			break;
 		}
 
 		/* Check response byte of EZCONFIG_CHECK command */
-		if (radioCmd[0] == SI4455_CMD_ID_EZCONFIG_CHECK) {
+		if (radio_cmd[0] == SI4455_CMD_ID_EZCONFIG_CHECK) {
 			if (response) {
 				/* Number of command bytes exceeds
 				 * maximal allowable length
 				 */
 				ret = -EIO;
-				dev_err(port->dev,
-					"%s: EZConfig check error(%i)",
-					__func__,
-					radioCmd[0]);
+				dev_err(port->dev, "%s: EZConfig check error(%i)",
+					__func__, radio_cmd[0]);
 				break;
 			}
 		}
 
 		/* Get and clear all interrupts.  An error has occurred... */
-		si4455_get_int_status(port, 0, 0, 0, &intStatus);
-		if (intStatus.CHIP_PEND
-			& SI4455_CMD_GET_CHIP_STATUS_REP_CMD_ERROR_PEND_MASK) {
+		si4455_get_int_status(port, 0, 0, 0, &int_status);
+		if (int_status.CHIP_PEND
+			& SI4455_CMD_GET_CHIP_STATUS_ERROR_PEND_MASK) {
 			ret = -EIO;
-			dev_err(port->dev,
-				"%s: chip error(%i)",
-				__func__,
-				intStatus.CHIP_PEND);
+			dev_err(port->dev, "%s: chip error(%i)",
+				__func__, int_status.CHIP_PEND);
 			break;
 		}
 	}
@@ -969,34 +860,34 @@ static irqreturn_t si4455_port_irq(struct si4455_port *s)
 {
 	struct uart_port *port = &s->one.port;
 	irqreturn_t ret = IRQ_NONE;
-	struct si4455_int_status intStatus = { 0 };
-	struct si4455_fifo_info fifoInfo = { 0 };
+	struct si4455_int_status int_status = { 0 };
+	struct si4455_fifo_info fifo_info = { 0 };
 
 	mutex_lock(&s->mutex);
 	if (s->configured && (s->power_count > 0)) {
-		if (!si4455_get_int_status(port, 0, 0, 0, &intStatus)) {
+		if (!si4455_get_int_status(port, 0, 0, 0, &int_status)) {
 			si4455_get_modem_status(port, 0, &s->modem_status);
-			if (intStatus.CHIP_PEND
-			& SI4455_CMD_GET_CHIP_STATUS_REP_CMD_ERROR_PEND_BIT) {
+			if (int_status.CHIP_PEND
+			    & SI4455_CMD_GET_CHIP_STATUS_ERROR_PEND_BIT) {
 				dev_err(port->dev,
 					"%s: CHIP_STATUS:CMD_ERROR_PEND",
 					__func__);
-			} else if (intStatus.PH_PEND
-			& SI4455_CMD_GET_INT_STATUS_REP_PACKET_SENT_PEND_BIT) {
+			} else if (int_status.PH_PEND
+				   & SI4455_CMD_GET_INT_STATUS_PACKET_SENT_PEND_BIT) {
 				dev_dbg(port->dev,
 					"%s: PH_STATUS:PACKET_SENT_PEND",
 					__func__);
 				si4455_handle_tx_pend(s);
-			} else if (intStatus.PH_PEND
-			& SI4455_CMD_GET_INT_STATUS_REP_PACKET_RX_PEND_BIT) {
+			} else if (int_status.PH_PEND
+				   & SI4455_CMD_GET_INT_STATUS_PACKET_RX_PEND_BIT) {
 				dev_dbg(port->dev,
 					"%s: PH_STATUS:PACKET_RX_PEND",
 					__func__);
 				s->current_rssi = s->modem_status.CURR_RSSI;
-				si4455_fifo_info(port, 0, &fifoInfo);
+				si4455_fifo_info(port, 0, &fifo_info);
 				si4455_handle_rx_pend(s);
-			} else if (intStatus.PH_PEND
-			& SI4455_CMD_GET_INT_STATUS_REP_CRC_ERROR_BIT) {
+			} else if (int_status.PH_PEND
+				   & SI4455_CMD_GET_INT_STATUS_CRC_ERROR_BIT) {
 				dev_dbg(port->dev,
 					"%s: PH_STATUS:CRC_ERROR_PEND",
 					__func__);
@@ -1049,12 +940,6 @@ static void si4455_set_mctrl(struct uart_port *port,
 	dev_dbg(port->dev, "%s", __func__);
 }
 
-static void si4455_break_ctl(struct uart_port *port,
-				int break_state)
-{
-	dev_dbg(port->dev, "%s", __func__);
-}
-
 static void si4455_set_termios(struct uart_port *port,
 				struct ktermios *termios,
 				struct ktermios *old)
@@ -1062,14 +947,6 @@ static void si4455_set_termios(struct uart_port *port,
 	dev_dbg(port->dev, "%s", __func__);
 }
 
-static int si4455_rs485_config(struct uart_port *port,
-				struct serial_rs485 *rs485)
-{
-	dev_dbg(port->dev, "%s", __func__);
-
-	return 0;
-}
-
 static int si4455_startup(struct uart_port *port)
 {
 	dev_dbg(port->dev, "%s", __func__);
@@ -1087,21 +964,14 @@ static const char *si4455_type(struct uart_port *port)
 {
 	struct si4455_port *s = dev_get_drvdata(port->dev);
 
-	if (port->type == PORT_SI4455) {
-		if (s->part_info.ROMID == 3)
-			return "SI4455-B1A";
-		else if (s->part_info.ROMID == 6)
-			return "SI4455-C2A";
-
-	}
-	return NULL;
-}
+	if (port->type != PORT_SI4455)
+		return NULL;
+	if (s->part_info.ROMID == 3)
+		return "SI4455-B1A";
+	else if (s->part_info.ROMID == 6)
+		return "SI4455-C2A";
 
-static int si4455_request_port(struct uart_port *port)
-{
-	/* Do nothing */
-	dev_dbg(port->dev, "%s", __func__);
-	return 0;
+	return "SI4455(UNKNOWN-REV)";
 }
 
 static void si4455_config_port(struct uart_port *port,
@@ -1142,93 +1012,77 @@ static int si4455_ioctl(struct uart_port *port,
 			unsigned long arg)
 {
 	struct si4455_port *s = dev_get_drvdata(port->dev);
+	void __user *argp = (void *)arg;
 	int ret = 0;
 
 	dev_dbg(port->dev, "%s(%u)", __func__, cmd);
 	switch (cmd) {
 	case SI4455_IOC_SEZC:
-	memcpy(&s->configuration, (void *)arg, sizeof(s->configuration));
-	dev_dbg(port->dev,

drivers/tty/serial/si4455.c static int si4455_ioctl(struct uart_port *port, · line 1025

Quoted 10 lines
drivers/tty/serial/si4455.c renamed from drivers/staging/si4455/si4455.c +5 -5
-		"%s(%u): SI4455_IOC_SEZC, length(%i)",
-		__func__,
-		cmd,
-		s->configuration.length);
-	ret = si4455_re_configure(port);
+		ret = copy_from_user(&s->configuration, argp, sizeof(s->configuration));
+		if (ret) {
+			dev_err(port->dev, "%s: SI4455_IOC_SEZC: copy_from_user_error(%i)",
+				__func__, ret);
+			return -EIO;

This isn't right. Don't allow a malitious user to spam dmesg with error messages. Return -EFAULT if copy_from_user() fails.

	if (copy_from_user(&s->configuration, argp, sizeof(s->configuration)))
		return -EFAULT;
Quoted 41 lines
drivers/tty/serial/si4455.c renamed from drivers/staging/si4455/si4455.c +18 -17
+		}
+		dev_dbg(port->dev, "%s(%u): SI4455_IOC_SEZC, length(%i)",
+			__func__, cmd, s->configuration.length);
+		ret = si4455_re_configure(port);
 	break;
 	case SI4455_IOC_CEZC:
-	dev_dbg(port->dev,
-		"%s(%u): SI4455_IOC_CEZC",
-		__func__,
-		cmd);
-	memset(&s->configuration, 0x00, sizeof(s->configuration));
-	ret = si4455_re_configure(port);
+		dev_dbg(port->dev, "%s(%u): SI4455_IOC_CEZC",
+			__func__, cmd);
+		memset(&s->configuration, 0x00, sizeof(s->configuration));
+		ret = si4455_re_configure(port);
 	break;
 	case SI4455_IOC_SEZP:
-	memcpy(&s->patch, (void *)arg, sizeof(s->patch));
-	dev_dbg(port->dev,
-		"%s(%u): SI4455_IOC_SEZP, length(%i)",
-		__func__,
-		cmd,
-		s->configuration.length);
+		ret = copy_from_user(&s->patch, argp, sizeof(s->patch));
+		if (ret) {
+			dev_err(port->dev, "%s: SI4455_IOC_SEZP: copy_from_user_error(%i)",
+				__func__, ret);
+			return -EIO;
+		}
+		dev_dbg(port->dev, "%s(%u): SI4455_IOC_SEZP, length(%i)",
+			__func__, cmd, s->configuration.length);
 	break;
 	case SI4455_IOC_CEZP:
-	dev_dbg(port->dev,
-		"%s(%u): SI4455_IOC_CEZP",
-		__func__,
-		cmd);
-	memset(&s->patch, 0x00, sizeof(s->patch));
+		dev_dbg(port->dev, "%s(%u): SI4455_IOC_CEZP",
+			__func__, cmd);

drivers/tty/serial/si4455.c static int si4455_ioctl(struct uart_port *port, · line 1053

Quoted 10 lines
drivers/tty/serial/si4455.c renamed from drivers/staging/si4455/si4455.c +2 -6
+		memset(&s->patch, 0x00, sizeof(s->patch));
 	break;
 	case SI4455_IOC_STXC:
-	s->tx_channel = *((u32 *)arg);
-	dev_dbg(port->dev,
-		"%s(%u): SI4455_IOC_STXC, tx_channel(%i)",
-		__func__,
-		cmd,
-		s->tx_channel);
+		s->tx_channel = *((u32 *)arg);

No. Any use of arg after the argp assignment in this function is a security problem. All accesses of "argp" need to use copy_to/from_user or get/put_user().

Quoted 57 lines
drivers/tty/serial/si4455.c renamed from drivers/staging/si4455/si4455.c +17 -28
+		dev_dbg(port->dev, "%s(%u): SI4455_IOC_STXC, tx_channel(%i)",
+			__func__, cmd, s->tx_channel);
 	break;
 	case SI4455_IOC_GTXC:
-	dev_dbg(port->dev,
-		"%s(%u): SI4455_IOC_GTXC",
-		__func__,
-		cmd);
-	*((u32 *)arg) = s->tx_channel;
+		dev_dbg(port->dev, "%s(%u): SI4455_IOC_GTXC",
+			__func__, cmd);
+		*((u32 *)arg) = s->tx_channel;
 	break;
 	case SI4455_IOC_SRXC:
-	s->rx_channel = *((u32 *)arg);
-	dev_dbg(port->dev,
-		"%s(%u): SI4455_IOC_SRXC, rx_channel(%i)",
-		__func__,
-		cmd,
-		s->rx_channel);
+		s->rx_channel = *((u32 *)arg);
+		dev_dbg(port->dev, "%s(%u): SI4455_IOC_SRXC, rx_channel(%i)",
+			__func__, cmd, s->rx_channel);
 	break;
 	case SI4455_IOC_GRXC:
-	dev_dbg(port->dev,
-		"%s(%u): SI4455_IOC_GRXC",
-		__func__,
-		cmd);
-	*((u32 *)arg) = s->rx_channel;
+		dev_dbg(port->dev, "%s(%u): SI4455_IOC_GRXC",
+			__func__, cmd);
+		*((u32 *)arg) = s->rx_channel;
 	break;
 	case SI4455_IOC_SSIZ:
-	s->package_size = *((u32 *)arg);
-	dev_dbg(port->dev,
-		"%s(%u): SI4455_IOC_SSIZ, package_size(%i)",
-		__func__,
-		cmd,
-		s->package_size);
+		s->package_size = *((u32 *)arg);
+		dev_dbg(port->dev, "%s(%u): SI4455_IOC_SSIZ, package_size(%i)",
+			__func__, cmd, s->package_size);
 	break;
 	case SI4455_IOC_GSIZ:
-	dev_dbg(port->dev,
-		"%s(%u): SI4455_IOC_GSIZ",
-		__func__,
-		cmd);
-	*((u32 *)arg) = s->package_size;
+		dev_dbg(port->dev, "%s(%u): SI4455_IOC_GSIZ",
+			__func__, cmd);
+		*((u32 *)arg) = s->package_size;
 	break;
 	case SI4455_IOC_GRSSI:
-	dev_dbg(port->dev,

drivers/tty/serial/si4455.c static int si4455_ioctl(struct uart_port *port, · line 1088

Quoted 10 lines
drivers/tty/serial/si4455.c renamed from drivers/staging/si4455/si4455.c +3 -4
-		"%s(%u): SI4455_IOC_GRSSI",
-		__func__,
-		cmd);
-	*((u32 *)arg) = s->current_rssi;
+		dev_dbg(port->dev, "%s(%u): SI4455_IOC_GRSSI",
+			__func__, cmd);
+		*((u32 *)arg) = s->current_rssi;
 	break;
 	default:
 		ret = -ENOIOCTLCMD;

regards,
dan carpenter