net: ks8851: Added support for half-duplex SPI
authorSergey Shcherbakov <shchers@gmail.com>
Thu, 9 Mar 2017 00:58:14 +0000 (02:58 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 10 Mar 2017 02:18:37 +0000 (18:18 -0800)
In original driver was implemented support for half-
and full-duplex modes, but it was not enabled. Instead
of it ks8851_rx_1msg method always returns "true" that
means "full-duplex" mode.

This patch replaces hard-coded functionality with
flexible solution that supports both SPI modes.

Signed-off-by: Sergey Shcherbakov <shchers@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/micrel/ks8851.c

index 279ee4612981b0af8d482674c6f1f5525988a6f7..20358f87de57053b6e8a0cdd5078334260e1be6b 100644 (file)
@@ -211,25 +211,6 @@ static void ks8851_wrreg8(struct ks8851_net *ks, unsigned reg, unsigned val)
                netdev_err(ks->netdev, "spi_sync() failed\n");
 }
 
-/**
- * ks8851_rx_1msg - select whether to use one or two messages for spi read
- * @ks: The device structure
- *
- * Return whether to generate a single message with a tx and rx buffer
- * supplied to spi_sync(), or alternatively send the tx and rx buffers
- * as separate messages.
- *
- * Depending on the hardware in use, a single message may be more efficient
- * on interrupts or work done by the driver.
- *
- * This currently always returns true until we add some per-device data passed
- * from the platform code to specify which mode is better.
- */
-static inline bool ks8851_rx_1msg(struct ks8851_net *ks)
-{
-       return true;
-}
-
 /**
  * ks8851_rdreg - issue read register command and return the data
  * @ks: The device state
@@ -251,14 +232,7 @@ static void ks8851_rdreg(struct ks8851_net *ks, unsigned op,
 
        txb[0] = cpu_to_le16(op | KS_SPIOP_RD);
 
-       if (ks8851_rx_1msg(ks)) {
-               msg = &ks->spi_msg1;
-               xfer = &ks->spi_xfer1;
-
-               xfer->tx_buf = txb;
-               xfer->rx_buf = trx;
-               xfer->len = rxl + 2;
-       } else {
+       if (ks->spidev->master->flags & SPI_MASTER_HALF_DUPLEX) {
                msg = &ks->spi_msg2;
                xfer = ks->spi_xfer2;
 
@@ -270,15 +244,22 @@ static void ks8851_rdreg(struct ks8851_net *ks, unsigned op,
                xfer->tx_buf = NULL;
                xfer->rx_buf = trx;
                xfer->len = rxl;
+       } else {
+               msg = &ks->spi_msg1;
+               xfer = &ks->spi_xfer1;
+
+               xfer->tx_buf = txb;
+               xfer->rx_buf = trx;
+               xfer->len = rxl + 2;
        }
 
        ret = spi_sync(ks->spidev, msg);
        if (ret < 0)
                netdev_err(ks->netdev, "read: spi_sync() failed\n");
-       else if (ks8851_rx_1msg(ks))
-               memcpy(rxb, trx + 2, rxl);
-       else
+       else if (ks->spidev->master->flags & SPI_MASTER_HALF_DUPLEX)
                memcpy(rxb, trx, rxl);
+       else
+               memcpy(rxb, trx + 2, rxl);
 }
 
 /**