Re: [RFC PATCH v3 3/3] SPI: Add virtio SPI driver.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 13.02.24 18:49, Mark Brown wrote:
On Tue, Feb 13, 2024 at 02:53:50PM +0100, Harald Mommer wrote:

+/*
+ * See also
+ *https://lore.kernel.org/all/6171c1c3-55ba-4f74-ae60-764820cf1caf@xxxxxxxxxxx
+ */
+static int virtio_spi_set_delays(struct spi_transfer_head *th,
+				 struct spi_device *spi,
+				 struct spi_transfer *xfer)
Please write actual comments that can be read standalone, the reader has
absolutely no idea why they'd want to follow the link and there's
nothing being referenced by that "also".
Replace link by Haixu Cui's diagram + explanations.The explanations were helpful so I wanted to keep this but the comment may now be too long to be accepted. We will see what happens.
+static int virtio_spi_one_transfer(struct virtio_spi_req *spi_req,
+				   struct spi_controller *ctrl,
+				   struct spi_message *msg,
+				   struct spi_transfer *xfer)
+	/*
+	 * Got comment: "The virtio spec for cs_change is *not* what the Linux
+	 * cs_change field does, this will not do the right thing."
+	 * TODO: Understand/discuss this, still unclear what may be wrong here
+	 */
+	th->cs_change = xfer->cs_change;

I got the comment originally from you, Mark Brown. After some digging still unclear what should be wrong and in the meantime I think nothing is wrong at all. To point you with the nose on the pending issue I added this comment here.

I'll remove the comment because I think there is no problem. Please protest if I'm wrong.

+static int virtio_spi_transfer_one_message(struct spi_controller *ctrl,
+					   struct spi_message *msg)
+{
+	struct virtio_spi_priv *priv = spi_controller_get_devdata(ctrl);
+	struct virtio_spi_req *spi_req;
+	struct spi_transfer *xfer;
+	int ret = 0;
+
+	spi_req = kzalloc(sizeof(*spi_req), GFP_KERNEL);
+	if (!spi_req) {
+		ret = -ENOMEM;
+		goto no_mem;
+	}
Why not just allocate this once, it's not like it's possible to send
more than one message simultaneously?
Will be done, struct virtio_spi_req spi_req will become a member of struct virtio_spi_priv.
+	/*
+	 * Simple implementation: Process message by message and wait for each
+	 * message to be completed by the device side.
+	 */
+	list_for_each_entry(xfer, &msg->transfers, transfer_list) {
This is processing transfers within a message rather than messages.
Obviously I did not get the terminology of messages and transfers not correct which made the comment wrong. Comment to be corrected (and shortened).
+		ret = virtio_spi_one_transfer(spi_req, ctrl, msg, xfer);
+		if (ret)
+			goto msg_done;
+
+		virtqueue_kick(priv->vq);
+
+		wait_for_completion(&spi_req->completion);
+
+		/* Read result from message */
+		ret = (int)spi_req->result.result;
+		if (ret)
+			goto msg_done;
It's not clear why this isn't within _spi_transfer_one() and then we
don't just use a transfer_one() callback and factor everything out to
the core?

Lack of experience. I saw one way of doing the job which missing the more simple way. Therefore we have reviews. Using now the alternative callback which shortens and simplifies the code.

Applied code changes, have to run some more tests.






[Index of Archives]     [Linux Kernel]     [Linux ARM (vger)]     [Linux ARM MSM]     [Linux Omap]     [Linux Arm]     [Linux Tegra]     [Fedora ARM]     [Linux for Samsung SOC]     [eCos]     [Linux Fastboot]     [Gcc Help]     [Git]     [DCCP]     [IETF Announce]     [Security]     [Linux MIPS]     [Yosemite Campsites]

  Powered by Linux