Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f3e03e2e authored by Tomoya MORINAGA's avatar Tomoya MORINAGA Committed by Grant Likely
Browse files

spi-topcliff-pch: Fix overrun issue



We found that adding load, Rx data sometimes drops.(with DMA transfer mode)
The cause is that before starting Rx-DMA processing, Tx-DMA processing starts.
This causes FIFO overrun occurs.

This patch fixes the issue by modifying FIFO tx-threshold and DMA descriptor
size like below.

                      Current                   this patch
Rx-descriptor   4Byte+12Byte*341    -->    12Byte*340-4Byte-12Byte
Rx-threshold                   (Not modified)
Tx-descriptor   4Byte+12Byte*341    -->    16Byte-12Byte*340
Rx-threshold    12Byte              -->    2Byte

Signed-off-by: default avatarTomoya MORINAGA <tomoya-linux@dsn.okisemi.com>
Signed-off-by: default avatarGrant Likely <grant.likely@secretlab.ca>
parent 25e803f9
Loading
Loading
Loading
Loading
+23 −5
Original line number Original line Diff line number Diff line
@@ -50,6 +50,8 @@
#define PCH_RX_THOLD		7
#define PCH_RX_THOLD		7
#define PCH_RX_THOLD_MAX	15
#define PCH_RX_THOLD_MAX	15


#define PCH_TX_THOLD		2

#define PCH_MAX_BAUDRATE	5000000
#define PCH_MAX_BAUDRATE	5000000
#define PCH_MAX_FIFO_DEPTH	16
#define PCH_MAX_FIFO_DEPTH	16


@@ -1040,8 +1042,7 @@ static void pch_spi_handle_dma(struct pch_spi_data *data, int *bpw)
	/* set receive fifo threshold and transmit fifo threshold */
	/* set receive fifo threshold and transmit fifo threshold */
	pch_spi_setclr_reg(data->master, PCH_SPCR,
	pch_spi_setclr_reg(data->master, PCH_SPCR,
			   ((size - 1) << SPCR_RFIC_FIELD) |
			   ((size - 1) << SPCR_RFIC_FIELD) |
			   ((PCH_MAX_FIFO_DEPTH - PCH_DMA_TRANS_SIZE) <<
			   (PCH_TX_THOLD << SPCR_TFIC_FIELD),
			    SPCR_TFIC_FIELD),
			   MASK_RFIC_SPCR_BITS | MASK_TFIC_SPCR_BITS);
			   MASK_RFIC_SPCR_BITS | MASK_TFIC_SPCR_BITS);


	spin_unlock_irqrestore(&data->lock, flags);
	spin_unlock_irqrestore(&data->lock, flags);
@@ -1052,13 +1053,20 @@ static void pch_spi_handle_dma(struct pch_spi_data *data, int *bpw)
	/* offset, length setting */
	/* offset, length setting */
	sg = dma->sg_rx_p;
	sg = dma->sg_rx_p;
	for (i = 0; i < num; i++, sg++) {
	for (i = 0; i < num; i++, sg++) {
		if (i == 0) {
		if (i == (num - 2)) {
			sg->offset = 0;
			sg->offset = size * i;
			sg->offset = sg->offset * (*bpw / 8);
			sg_set_page(sg, virt_to_page(dma->rx_buf_virt), rem,
			sg_set_page(sg, virt_to_page(dma->rx_buf_virt), rem,
				    sg->offset);
				    sg->offset);
			sg_dma_len(sg) = rem;
			sg_dma_len(sg) = rem;
		} else if (i == (num - 1)) {
			sg->offset = size * (i - 1) + rem;
			sg->offset = sg->offset * (*bpw / 8);
			sg_set_page(sg, virt_to_page(dma->rx_buf_virt), size,
				    sg->offset);
			sg_dma_len(sg) = size;
		} else {
		} else {
			sg->offset = rem + size * (i - 1);
			sg->offset = size * i;
			sg->offset = sg->offset * (*bpw / 8);
			sg->offset = sg->offset * (*bpw / 8);
			sg_set_page(sg, virt_to_page(dma->rx_buf_virt), size,
			sg_set_page(sg, virt_to_page(dma->rx_buf_virt), size,
				    sg->offset);
				    sg->offset);
@@ -1082,6 +1090,16 @@ static void pch_spi_handle_dma(struct pch_spi_data *data, int *bpw)
	dma->desc_rx = desc_rx;
	dma->desc_rx = desc_rx;


	/* TX */
	/* TX */
	if (data->bpw_len > PCH_DMA_TRANS_SIZE) {
		num = data->bpw_len / PCH_DMA_TRANS_SIZE;
		size = PCH_DMA_TRANS_SIZE;
		rem = 16;
	} else {
		num = 1;
		size = data->bpw_len;
		rem = data->bpw_len;
	}

	dma->sg_tx_p = kzalloc(sizeof(struct scatterlist)*num, GFP_ATOMIC);
	dma->sg_tx_p = kzalloc(sizeof(struct scatterlist)*num, GFP_ATOMIC);
	sg_init_table(dma->sg_tx_p, num); /* Initialize SG table */
	sg_init_table(dma->sg_tx_p, num); /* Initialize SG table */
	/* offset, length setting */
	/* offset, length setting */