|  | /* include/linux/smux.h | 
|  | * | 
|  | * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved. | 
|  | * | 
|  | * This software is licensed under the terms of the GNU General Public | 
|  | * License version 2, as published by the Free Software Foundation, and | 
|  | * may be copied, distributed, and modified under those terms. | 
|  | * | 
|  | * This program is distributed in the hope that it will be useful, | 
|  | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | * GNU General Public License for more details. | 
|  | * | 
|  | */ | 
|  | #ifndef SMUX_H | 
|  | #define SMUX_H | 
|  |  | 
|  | /** | 
|  | * Logical Channel IDs | 
|  | * | 
|  | * This must be identical between local and remote clients. | 
|  | */ | 
|  | enum { | 
|  | /* Data Ports */ | 
|  | SMUX_DATA_0, | 
|  | SMUX_DATA_1, | 
|  | SMUX_DATA_2, | 
|  | SMUX_DATA_3, | 
|  | SMUX_DATA_4, | 
|  | SMUX_DATA_5, | 
|  | SMUX_DATA_6, | 
|  | SMUX_DATA_7, | 
|  | SMUX_DATA_8, | 
|  | SMUX_DATA_9, | 
|  | SMUX_USB_RMNET_DATA_0, | 
|  | SMUX_USB_DUN_0, | 
|  | SMUX_USB_DIAG_0, | 
|  | SMUX_SYS_MONITOR_0, | 
|  | SMUX_CSVT_0, | 
|  | /* add new data ports here */ | 
|  |  | 
|  | /* Control Ports */ | 
|  | SMUX_DATA_CTL_0 = 32, | 
|  | SMUX_DATA_CTL_1, | 
|  | SMUX_DATA_CTL_2, | 
|  | SMUX_DATA_CTL_3, | 
|  | SMUX_DATA_CTL_4, | 
|  | SMUX_DATA_CTL_5, | 
|  | SMUX_DATA_CTL_6, | 
|  | SMUX_DATA_CTL_7, | 
|  | SMUX_DATA_CTL_8, | 
|  | SMUX_DATA_CTL_9, | 
|  | SMUX_USB_RMNET_CTL_0, | 
|  | SMUX_USB_DUN_CTL_0_UNUSED, | 
|  | SMUX_USB_DIAG_CTL_0, | 
|  | SMUX_SYS_MONITOR_CTL_0, | 
|  | SMUX_CSVT_CTL_0, | 
|  | /* add new control ports here */ | 
|  |  | 
|  | SMUX_TEST_LCID, | 
|  | SMUX_NUM_LOGICAL_CHANNELS, | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Notification events that are passed to the notify() function. | 
|  | * | 
|  | * If the @metadata argument in the notifier is non-null, then it will | 
|  | * point to the associated struct smux_meta_* structure. | 
|  | */ | 
|  | enum { | 
|  | SMUX_CONNECTED,       /* @metadata is null */ | 
|  | SMUX_DISCONNECTED, | 
|  | SMUX_READ_DONE, | 
|  | SMUX_READ_FAIL, | 
|  | SMUX_WRITE_DONE, | 
|  | SMUX_WRITE_FAIL, | 
|  | SMUX_TIOCM_UPDATE, | 
|  | SMUX_LOW_WM_HIT,      /* @metadata is NULL */ | 
|  | SMUX_HIGH_WM_HIT,     /* @metadata is NULL */ | 
|  | SMUX_RX_RETRY_HIGH_WM_HIT,  /* @metadata is NULL */ | 
|  | SMUX_RX_RETRY_LOW_WM_HIT,   /* @metadata is NULL */ | 
|  | SMUX_LOCAL_CLOSED, | 
|  | SMUX_REMOTE_CLOSED, | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Channel options used to modify channel behavior. | 
|  | */ | 
|  | enum { | 
|  | SMUX_CH_OPTION_LOCAL_LOOPBACK = 1 << 0, | 
|  | SMUX_CH_OPTION_REMOTE_LOOPBACK = 1 << 1, | 
|  | SMUX_CH_OPTION_REMOTE_TX_STOP = 1 << 2, | 
|  | SMUX_CH_OPTION_AUTO_REMOTE_TX_STOP = 1 << 3, | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Metadata for SMUX_DISCONNECTED notification | 
|  | * | 
|  | * @is_ssr:  Disconnect caused by subsystem restart | 
|  | */ | 
|  | struct smux_meta_disconnected { | 
|  | int is_ssr; | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Metadata for SMUX_READ_DONE/SMUX_READ_FAIL notification | 
|  | * | 
|  | * @pkt_priv: Packet-specific private data | 
|  | * @buffer:   Buffer pointer passed into msm_smux_write | 
|  | * @len:      Buffer length passed into  msm_smux_write | 
|  | */ | 
|  | struct smux_meta_read { | 
|  | void *pkt_priv; | 
|  | void *buffer; | 
|  | int len; | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Metadata for SMUX_WRITE_DONE/SMUX_WRITE_FAIL notification | 
|  | * | 
|  | * @pkt_priv: Packet-specific private data | 
|  | * @buffer:  Buffer pointer returned by get_rx_buffer() | 
|  | * @len:     Buffer length returned by get_rx_buffer() | 
|  | */ | 
|  | struct smux_meta_write { | 
|  | void *pkt_priv; | 
|  | void *buffer; | 
|  | int len; | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * Metadata for SMUX_TIOCM_UPDATE notification | 
|  | * | 
|  | * @tiocm_old:  Previous TIOCM state | 
|  | * @tiocm_new:   Current TIOCM state | 
|  | */ | 
|  | struct smux_meta_tiocm { | 
|  | uint32_t tiocm_old; | 
|  | uint32_t tiocm_new; | 
|  | }; | 
|  |  | 
|  |  | 
|  | #ifdef CONFIG_N_SMUX | 
|  | /** | 
|  | * Starts the opening sequence for a logical channel. | 
|  | * | 
|  | * @lcid          Logical channel ID | 
|  | * @priv          Free for client usage | 
|  | * @notify        Event notification function | 
|  | * @get_rx_buffer Function used to provide a receive buffer to SMUX | 
|  | * | 
|  | * @returns 0 for success, <0 otherwise | 
|  | * | 
|  | * A channel must be fully closed (either not previously opened or | 
|  | * msm_smux_close() has been called and the SMUX_DISCONNECTED has been | 
|  | * recevied. | 
|  | * | 
|  | * One the remote side is opened, the client will receive a SMUX_CONNECTED | 
|  | * event. | 
|  | */ | 
|  | int msm_smux_open(uint8_t lcid, void *priv, | 
|  | void (*notify)(void *priv, int event_type, const void *metadata), | 
|  | int (*get_rx_buffer)(void *priv, void **pkt_priv, | 
|  | void **buffer, int size)); | 
|  |  | 
|  | /** | 
|  | * Starts the closing sequence for a logical channel. | 
|  | * | 
|  | * @lcid    Logical channel ID | 
|  | * @returns 0 for success, <0 otherwise | 
|  | * | 
|  | * Once the close event has been acknowledge by the remote side, the client | 
|  | * will receive a SMUX_DISCONNECTED notification. | 
|  | */ | 
|  | int msm_smux_close(uint8_t lcid); | 
|  |  | 
|  | /** | 
|  | * Write data to a logical channel. | 
|  | * | 
|  | * @lcid      Logical channel ID | 
|  | * @pkt_priv  Client data that will be returned with the SMUX_WRITE_DONE or | 
|  | *            SMUX_WRITE_FAIL notification. | 
|  | * @data      Data to write | 
|  | * @len       Length of @data | 
|  | * | 
|  | * @returns   0 for success, <0 otherwise | 
|  | * | 
|  | * Data may be written immediately after msm_smux_open() is called, but | 
|  | * the data will wait in the transmit queue until the channel has been | 
|  | * fully opened. | 
|  | * | 
|  | * Once the data has been written, the client will receive either a completion | 
|  | * (SMUX_WRITE_DONE) or a failure notice (SMUX_WRITE_FAIL). | 
|  | */ | 
|  | int msm_smux_write(uint8_t lcid, void *pkt_priv, const void *data, int len); | 
|  |  | 
|  | /** | 
|  | * Returns true if the TX queue is currently full (high water mark). | 
|  | * | 
|  | * @lcid      Logical channel ID | 
|  | * | 
|  | * @returns   0 if channel is not full; 1 if it is full; < 0 for error | 
|  | */ | 
|  | int msm_smux_is_ch_full(uint8_t lcid); | 
|  |  | 
|  | /** | 
|  | * Returns true if the TX queue has space for more packets it is at or | 
|  | * below the low water mark). | 
|  | * | 
|  | * @lcid      Logical channel ID | 
|  | * | 
|  | * @returns   0 if channel is above low watermark | 
|  | *            1 if it's at or below the low watermark | 
|  | *            < 0 for error | 
|  | */ | 
|  | int msm_smux_is_ch_low(uint8_t lcid); | 
|  |  | 
|  | /** | 
|  | * Get the TIOCM status bits. | 
|  | * | 
|  | * @lcid      Logical channel ID | 
|  | * | 
|  | * @returns   >= 0 TIOCM status bits | 
|  | *            < 0  Error condition | 
|  | */ | 
|  | long msm_smux_tiocm_get(uint8_t lcid); | 
|  |  | 
|  | /** | 
|  | * Set/clear the TIOCM status bits. | 
|  | * | 
|  | * @lcid      Logical channel ID | 
|  | * @set       Bits to set | 
|  | * @clear     Bits to clear | 
|  | * | 
|  | * @returns   0 for success; < 0 for failure | 
|  | * | 
|  | * If a bit is specified in both the @set and @clear masks, then the clear bit | 
|  | * definition will dominate and the bit will be cleared. | 
|  | */ | 
|  | int msm_smux_tiocm_set(uint8_t lcid, uint32_t set, uint32_t clear); | 
|  |  | 
|  | /** | 
|  | * Set or clear channel option using the SMUX_CH_OPTION_* channel | 
|  | * flags. | 
|  | * | 
|  | * @lcid   Logical channel ID | 
|  | * @set    Options to set | 
|  | * @clear  Options to clear | 
|  | * | 
|  | * @returns 0 for success, < 0 for failure | 
|  | */ | 
|  | int msm_smux_set_ch_option(uint8_t lcid, uint32_t set, uint32_t clear); | 
|  |  | 
|  | #else | 
|  | static inline int msm_smux_open(uint8_t lcid, void *priv, | 
|  | void (*notify)(void *priv, int event_type, const void *metadata), | 
|  | int (*get_rx_buffer)(void *priv, void **pkt_priv, | 
|  | void **buffer, int size)) | 
|  | { | 
|  | return -ENODEV; | 
|  | } | 
|  |  | 
|  | static inline int msm_smux_close(uint8_t lcid) | 
|  | { | 
|  | return -ENODEV; | 
|  | } | 
|  |  | 
|  | static inline int msm_smux_write(uint8_t lcid, void *pkt_priv, | 
|  | const void *data, int len) | 
|  | { | 
|  | return -ENODEV; | 
|  | } | 
|  |  | 
|  | static inline int msm_smux_is_ch_full(uint8_t lcid) | 
|  | { | 
|  | return -ENODEV; | 
|  | } | 
|  |  | 
|  | static inline int msm_smux_is_ch_low(uint8_t lcid) | 
|  | { | 
|  | return -ENODEV; | 
|  | } | 
|  |  | 
|  | static inline long msm_smux_tiocm_get(uint8_t lcid) | 
|  | { | 
|  | return 0; | 
|  | } | 
|  |  | 
|  | static inline int msm_smux_tiocm_set(uint8_t lcid, uint32_t set, uint32_t clear) | 
|  | { | 
|  | return -ENODEV; | 
|  | } | 
|  |  | 
|  | static inline int msm_smux_set_ch_option(uint8_t lcid, uint32_t set, | 
|  | uint32_t clear) | 
|  | { | 
|  | return -ENODEV; | 
|  | } | 
|  |  | 
|  | #endif /* CONFIG_N_SMUX */ | 
|  |  | 
|  | #endif /* SMUX_H */ |