sparc64: expand LDC interface
authorJag Raman <jag.raman@oracle.com>
Fri, 9 Jun 2017 16:29:28 +0000 (12:29 -0400)
committerDavid S. Miller <davem@davemloft.net>
Sat, 10 Jun 2017 21:10:54 +0000 (14:10 -0700)
Add the following LDC APIs which are planned to be used by
LDC clients in the future:
- ldc_set_state: Sets given LDC channel to given state
- ldc_mode: Returns the mode of given LDC channel
- ldc_print: Prints info about given LDC channel
- ldc_rx_reset: Reset the RX queue of given LDC channel

Signed-off-by: Jagannathan Raman <jag.raman@oracle.com>
Reviewed-by: Aaron Young <aaron.young@oracle.com>
Reviewed-by: Alexandre Chartre <alexandre.chartre@oracle.com>
Reviewed-by: Bijan Mottahedeh <bijan.mottahedeh@oracle.com>
Reviewed-by: Liam Merwick <liam.merwick@oracle.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc/include/asm/ldc.h
arch/sparc/kernel/ldc.c

index 6e9004a..698738a 100644 (file)
@@ -48,6 +48,8 @@ struct ldc_channel_config {
 #define LDC_STATE_READY                0x03
 #define LDC_STATE_CONNECTED    0x04
 
+#define        LDC_PACKET_SIZE         64
+
 struct ldc_channel;
 
 /* Allocate state for a channel.  */
@@ -72,6 +74,12 @@ int ldc_connect(struct ldc_channel *lp);
 int ldc_disconnect(struct ldc_channel *lp);
 
 int ldc_state(struct ldc_channel *lp);
+void ldc_set_state(struct ldc_channel *lp, u8 state);
+int ldc_mode(struct ldc_channel *lp);
+void __ldc_print(struct ldc_channel *lp, const char *caller);
+int ldc_rx_reset(struct ldc_channel *lp);
+
+#define        ldc_print(chan) __ldc_print(chan, __func__)
 
 /* Read and write operations.  Only valid when the link is up.  */
 int ldc_write(struct ldc_channel *lp, const void *buf,
index 59d5038..77c34b0 100644 (file)
@@ -34,7 +34,6 @@
 
 static char version[] =
        DRV_MODULE_NAME ".c:v" DRV_MODULE_VERSION " (" DRV_MODULE_RELDATE ")\n";
-#define LDC_PACKET_SIZE                64
 
 /* Packet header layout for unreliable and reliable mode frames.
  * When in RAW mode, packets are simply straight 64-byte payloads
@@ -196,15 +195,6 @@ static const char *state_to_str(u8 state)
        }
 }
 
-static void ldc_set_state(struct ldc_channel *lp, u8 state)
-{
-       ldcdbg(STATE, "STATE (%s) --> (%s)\n",
-              state_to_str(lp->state),
-              state_to_str(state));
-
-       lp->state = state;
-}
-
 static unsigned long __advance(unsigned long off, unsigned long num_entries)
 {
        off += LDC_PACKET_SIZE;
@@ -829,7 +819,7 @@ static irqreturn_t ldc_rx(int irq, void *dev_id)
         * everything.
         */
        if (lp->flags & LDC_FLAG_RESET) {
-               (void) __set_rx_head(lp, lp->rx_tail);
+               (void) ldc_rx_reset(lp);
                goto out;
        }
 
@@ -1447,6 +1437,38 @@ int ldc_state(struct ldc_channel *lp)
 }
 EXPORT_SYMBOL(ldc_state);
 
+void ldc_set_state(struct ldc_channel *lp, u8 state)
+{
+       ldcdbg(STATE, "STATE (%s) --> (%s)\n",
+              state_to_str(lp->state),
+              state_to_str(state));
+
+       lp->state = state;
+}
+
+int ldc_mode(struct ldc_channel *lp)
+{
+       return lp->cfg.mode;
+}
+
+int ldc_rx_reset(struct ldc_channel *lp)
+{
+       return __set_rx_head(lp, lp->rx_tail);
+}
+
+void __ldc_print(struct ldc_channel *lp, const char *caller)
+{
+       pr_info("%s: id=0x%lx flags=0x%x state=%s cstate=0x%lx hsstate=0x%x\n"
+               "\trx_h=0x%lx rx_t=0x%lx rx_n=%ld\n"
+               "\ttx_h=0x%lx tx_t=0x%lx tx_n=%ld\n"
+               "\trcv_nxt=%u snd_nxt=%u\n",
+               caller, lp->id, lp->flags, state_to_str(lp->state),
+               lp->chan_state, lp->hs_state,
+               lp->rx_head, lp->rx_tail, lp->rx_num_entries,
+               lp->tx_head, lp->tx_tail, lp->tx_num_entries,
+               lp->rcv_nxt, lp->snd_nxt);
+}
+
 static int write_raw(struct ldc_channel *lp, const void *buf, unsigned int size)
 {
        struct ldc_packet *p;
@@ -1592,7 +1614,7 @@ static int rx_bad_seq(struct ldc_channel *lp, struct ldc_packet *p,
        if (err)
                return err;
 
-       err = __set_rx_head(lp, lp->rx_tail);
+       err = ldc_rx_reset(lp);
        if (err < 0)
                return ldc_abort(lp);