cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

st_core.c (24622B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 *  Shared Transport Line discipline driver Core
      4 *	This hooks up ST KIM driver and ST LL driver
      5 *  Copyright (C) 2009-2010 Texas Instruments
      6 *  Author: Pavan Savoy <pavan_savoy@ti.com>
      7 */
      8
      9#define pr_fmt(fmt)	"(stc): " fmt
     10#include <linux/module.h>
     11#include <linux/kernel.h>
     12#include <linux/tty.h>
     13
     14#include <linux/seq_file.h>
     15#include <linux/skbuff.h>
     16
     17#include <linux/ti_wilink_st.h>
     18
     19extern void st_kim_recv(void *, const unsigned char *, long);
     20void st_int_recv(void *, const unsigned char *, long);
     21/*
     22 * function pointer pointing to either,
     23 * st_kim_recv during registration to receive fw download responses
     24 * st_int_recv after registration to receive proto stack responses
     25 */
     26static void (*st_recv) (void *, const unsigned char *, long);
     27
     28/********************************************************************/
     29static void add_channel_to_table(struct st_data_s *st_gdata,
     30		struct st_proto_s *new_proto)
     31{
     32	pr_info("%s: id %d\n", __func__, new_proto->chnl_id);
     33	/* list now has the channel id as index itself */
     34	st_gdata->list[new_proto->chnl_id] = new_proto;
     35	st_gdata->is_registered[new_proto->chnl_id] = true;
     36}
     37
     38static void remove_channel_from_table(struct st_data_s *st_gdata,
     39		struct st_proto_s *proto)
     40{
     41	pr_info("%s: id %d\n", __func__, proto->chnl_id);
     42/*	st_gdata->list[proto->chnl_id] = NULL; */
     43	st_gdata->is_registered[proto->chnl_id] = false;
     44}
     45
     46/*
     47 * called from KIM during firmware download.
     48 *
     49 * This is a wrapper function to tty->ops->write_room.
     50 * It returns number of free space available in
     51 * uart tx buffer.
     52 */
     53int st_get_uart_wr_room(struct st_data_s *st_gdata)
     54{
     55	if (unlikely(st_gdata == NULL || st_gdata->tty == NULL)) {
     56		pr_err("tty unavailable to perform write");
     57		return -1;
     58	}
     59
     60	return tty_write_room(st_gdata->tty);
     61}
     62
     63/*
     64 * can be called in from
     65 * -- KIM (during fw download)
     66 * -- ST Core (during st_write)
     67 *
     68 *  This is the internal write function - a wrapper
     69 *  to tty->ops->write
     70 */
     71int st_int_write(struct st_data_s *st_gdata,
     72	const unsigned char *data, int count)
     73{
     74	struct tty_struct *tty;
     75	if (unlikely(st_gdata == NULL || st_gdata->tty == NULL)) {
     76		pr_err("tty unavailable to perform write");
     77		return -EINVAL;
     78	}
     79	tty = st_gdata->tty;
     80#ifdef VERBOSE
     81	print_hex_dump(KERN_DEBUG, "<out<", DUMP_PREFIX_NONE,
     82		16, 1, data, count, 0);
     83#endif
     84	return tty->ops->write(tty, data, count);
     85
     86}
     87
     88/*
     89 * push the skb received to relevant
     90 * protocol stacks
     91 */
     92static void st_send_frame(unsigned char chnl_id, struct st_data_s *st_gdata)
     93{
     94	pr_debug(" %s(prot:%d) ", __func__, chnl_id);
     95
     96	if (unlikely
     97	    (st_gdata == NULL || st_gdata->rx_skb == NULL
     98	     || st_gdata->is_registered[chnl_id] == false)) {
     99		pr_err("chnl_id %d not registered, no data to send?",
    100			   chnl_id);
    101		kfree_skb(st_gdata->rx_skb);
    102		return;
    103	}
    104	/*
    105	 * this cannot fail
    106	 * this shouldn't take long
    107	 * - should be just skb_queue_tail for the
    108	 *   protocol stack driver
    109	 */
    110	if (likely(st_gdata->list[chnl_id]->recv != NULL)) {
    111		if (unlikely
    112			(st_gdata->list[chnl_id]->recv
    113			(st_gdata->list[chnl_id]->priv_data, st_gdata->rx_skb)
    114			     != 0)) {
    115			pr_err(" proto stack %d's ->recv failed", chnl_id);
    116			kfree_skb(st_gdata->rx_skb);
    117			return;
    118		}
    119	} else {
    120		pr_err(" proto stack %d's ->recv null", chnl_id);
    121		kfree_skb(st_gdata->rx_skb);
    122	}
    123	return;
    124}
    125
    126/*
    127 * st_reg_complete - to call registration complete callbacks
    128 * of all protocol stack drivers
    129 * This function is being called with spin lock held, protocol drivers are
    130 * only expected to complete their waits and do nothing more than that.
    131 */
    132static void st_reg_complete(struct st_data_s *st_gdata, int err)
    133{
    134	unsigned char i = 0;
    135	pr_info(" %s ", __func__);
    136	for (i = 0; i < ST_MAX_CHANNELS; i++) {
    137		if (likely(st_gdata != NULL &&
    138			st_gdata->is_registered[i] == true &&
    139				st_gdata->list[i]->reg_complete_cb != NULL)) {
    140			st_gdata->list[i]->reg_complete_cb
    141				(st_gdata->list[i]->priv_data, err);
    142			pr_info("protocol %d's cb sent %d\n", i, err);
    143			if (err) { /* cleanup registered protocol */
    144				st_gdata->is_registered[i] = false;
    145				if (st_gdata->protos_registered)
    146					st_gdata->protos_registered--;
    147			}
    148		}
    149	}
    150}
    151
    152static inline int st_check_data_len(struct st_data_s *st_gdata,
    153	unsigned char chnl_id, int len)
    154{
    155	int room = skb_tailroom(st_gdata->rx_skb);
    156
    157	pr_debug("len %d room %d", len, room);
    158
    159	if (!len) {
    160		/*
    161		 * Received packet has only packet header and
    162		 * has zero length payload. So, ask ST CORE to
    163		 * forward the packet to protocol driver (BT/FM/GPS)
    164		 */
    165		st_send_frame(chnl_id, st_gdata);
    166
    167	} else if (len > room) {
    168		/*
    169		 * Received packet's payload length is larger.
    170		 * We can't accommodate it in created skb.
    171		 */
    172		pr_err("Data length is too large len %d room %d", len,
    173			   room);
    174		kfree_skb(st_gdata->rx_skb);
    175	} else {
    176		/*
    177		 * Packet header has non-zero payload length and
    178		 * we have enough space in created skb. Lets read
    179		 * payload data */
    180		st_gdata->rx_state = ST_W4_DATA;
    181		st_gdata->rx_count = len;
    182		return len;
    183	}
    184
    185	/* Change ST state to continue to process next packet */
    186	st_gdata->rx_state = ST_W4_PACKET_TYPE;
    187	st_gdata->rx_skb = NULL;
    188	st_gdata->rx_count = 0;
    189	st_gdata->rx_chnl = 0;
    190
    191	return 0;
    192}
    193
    194/*
    195 * st_wakeup_ack - internal function for action when wake-up ack
    196 *	received
    197 */
    198static inline void st_wakeup_ack(struct st_data_s *st_gdata,
    199	unsigned char cmd)
    200{
    201	struct sk_buff *waiting_skb;
    202	unsigned long flags = 0;
    203
    204	spin_lock_irqsave(&st_gdata->lock, flags);
    205	/*
    206	 * de-Q from waitQ and Q in txQ now that the
    207	 * chip is awake
    208	 */
    209	while ((waiting_skb = skb_dequeue(&st_gdata->tx_waitq)))
    210		skb_queue_tail(&st_gdata->txq, waiting_skb);
    211
    212	/* state forwarded to ST LL */
    213	st_ll_sleep_state(st_gdata, (unsigned long)cmd);
    214	spin_unlock_irqrestore(&st_gdata->lock, flags);
    215
    216	/* wake up to send the recently copied skbs from waitQ */
    217	st_tx_wakeup(st_gdata);
    218}
    219
    220/*
    221 * st_int_recv - ST's internal receive function.
    222 *	Decodes received RAW data and forwards to corresponding
    223 *	client drivers (Bluetooth,FM,GPS..etc).
    224 *	This can receive various types of packets,
    225 *	HCI-Events, ACL, SCO, 4 types of HCI-LL PM packets
    226 *	CH-8 packets from FM, CH-9 packets from GPS cores.
    227 */
    228void st_int_recv(void *disc_data,
    229	const unsigned char *data, long count)
    230{
    231	char *ptr;
    232	struct st_proto_s *proto;
    233	unsigned short payload_len = 0;
    234	int len = 0;
    235	unsigned char type = 0;
    236	unsigned char *plen;
    237	struct st_data_s *st_gdata = (struct st_data_s *)disc_data;
    238	unsigned long flags;
    239
    240	ptr = (char *)data;
    241	/* tty_receive sent null ? */
    242	if (unlikely(ptr == NULL) || (st_gdata == NULL)) {
    243		pr_err(" received null from TTY ");
    244		return;
    245	}
    246
    247	pr_debug("count %ld rx_state %ld"
    248		   "rx_count %ld", count, st_gdata->rx_state,
    249		   st_gdata->rx_count);
    250
    251	spin_lock_irqsave(&st_gdata->lock, flags);
    252	/* Decode received bytes here */
    253	while (count) {
    254		if (st_gdata->rx_count) {
    255			len = min_t(unsigned int, st_gdata->rx_count, count);
    256			skb_put_data(st_gdata->rx_skb, ptr, len);
    257			st_gdata->rx_count -= len;
    258			count -= len;
    259			ptr += len;
    260
    261			if (st_gdata->rx_count)
    262				continue;
    263
    264			/* Check ST RX state machine , where are we? */
    265			switch (st_gdata->rx_state) {
    266			/* Waiting for complete packet ? */
    267			case ST_W4_DATA:
    268				pr_debug("Complete pkt received");
    269				/*
    270				 * Ask ST CORE to forward
    271				 * the packet to protocol driver
    272				 */
    273				st_send_frame(st_gdata->rx_chnl, st_gdata);
    274
    275				st_gdata->rx_state = ST_W4_PACKET_TYPE;
    276				st_gdata->rx_skb = NULL;
    277				continue;
    278			/* parse the header to know details */
    279			case ST_W4_HEADER:
    280				proto = st_gdata->list[st_gdata->rx_chnl];
    281				plen =
    282				&st_gdata->rx_skb->data
    283				[proto->offset_len_in_hdr];
    284				pr_debug("plen pointing to %x\n", *plen);
    285				if (proto->len_size == 1) /* 1 byte len field */
    286					payload_len = *(unsigned char *)plen;
    287				else if (proto->len_size == 2)
    288					payload_len =
    289					__le16_to_cpu(*(unsigned short *)plen);
    290				else
    291					pr_info("%s: invalid length "
    292					"for id %d\n",
    293					__func__, proto->chnl_id);
    294				st_check_data_len(st_gdata, proto->chnl_id,
    295						payload_len);
    296				pr_debug("off %d, pay len %d\n",
    297					proto->offset_len_in_hdr, payload_len);
    298				continue;
    299			}	/* end of switch rx_state */
    300		}
    301
    302		/* end of if rx_count */
    303
    304		/*
    305		 * Check first byte of packet and identify module
    306		 * owner (BT/FM/GPS)
    307		 */
    308		switch (*ptr) {
    309		case LL_SLEEP_IND:
    310		case LL_SLEEP_ACK:
    311		case LL_WAKE_UP_IND:
    312			pr_debug("PM packet");
    313			/*
    314			 * this takes appropriate action based on
    315			 * sleep state received --
    316			 */
    317			st_ll_sleep_state(st_gdata, *ptr);
    318			/*
    319			 * if WAKEUP_IND collides copy from waitq to txq
    320			 * and assume chip awake
    321			 */
    322			spin_unlock_irqrestore(&st_gdata->lock, flags);
    323			if (st_ll_getstate(st_gdata) == ST_LL_AWAKE)
    324				st_wakeup_ack(st_gdata, LL_WAKE_UP_ACK);
    325			spin_lock_irqsave(&st_gdata->lock, flags);
    326
    327			ptr++;
    328			count--;
    329			continue;
    330		case LL_WAKE_UP_ACK:
    331			pr_debug("PM packet");
    332
    333			spin_unlock_irqrestore(&st_gdata->lock, flags);
    334			/* wake up ack received */
    335			st_wakeup_ack(st_gdata, *ptr);
    336			spin_lock_irqsave(&st_gdata->lock, flags);
    337
    338			ptr++;
    339			count--;
    340			continue;
    341			/* Unknow packet? */
    342		default:
    343			type = *ptr;
    344
    345			/*
    346			 * Default case means non-HCILL packets,
    347			 * possibilities are packets for:
    348			 * (a) valid protocol -  Supported Protocols within
    349			 *     the ST_MAX_CHANNELS.
    350			 * (b) registered protocol - Checked by
    351			 *     "st_gdata->list[type] == NULL)" are supported
    352			 *     protocols only.
    353			 *  Rules out any invalid protocol and
    354			 *  unregistered protocols with channel ID < 16.
    355			 */
    356
    357			if ((type >= ST_MAX_CHANNELS) ||
    358					(st_gdata->list[type] == NULL)) {
    359				pr_err("chip/interface misbehavior: "
    360						"dropping frame starting "
    361						"with 0x%02x\n", type);
    362				goto done;
    363			}
    364
    365			st_gdata->rx_skb = alloc_skb(
    366					st_gdata->list[type]->max_frame_size,
    367					GFP_ATOMIC);
    368			if (st_gdata->rx_skb == NULL) {
    369				pr_err("out of memory: dropping\n");
    370				goto done;
    371			}
    372
    373			skb_reserve(st_gdata->rx_skb,
    374					st_gdata->list[type]->reserve);
    375			/* next 2 required for BT only */
    376			st_gdata->rx_skb->cb[0] = type; /*pkt_type*/
    377			st_gdata->rx_skb->cb[1] = 0; /*incoming*/
    378			st_gdata->rx_chnl = *ptr;
    379			st_gdata->rx_state = ST_W4_HEADER;
    380			st_gdata->rx_count = st_gdata->list[type]->hdr_len;
    381			pr_debug("rx_count %ld\n", st_gdata->rx_count);
    382		}
    383		ptr++;
    384		count--;
    385	}
    386done:
    387	spin_unlock_irqrestore(&st_gdata->lock, flags);
    388	pr_debug("done %s", __func__);
    389	return;
    390}
    391
    392/*
    393 * st_int_dequeue - internal de-Q function.
    394 *	If the previous data set was not written
    395 *	completely, return that skb which has the pending data.
    396 *	In normal cases, return top of txq.
    397 */
    398static struct sk_buff *st_int_dequeue(struct st_data_s *st_gdata)
    399{
    400	struct sk_buff *returning_skb;
    401
    402	pr_debug("%s", __func__);
    403	if (st_gdata->tx_skb != NULL) {
    404		returning_skb = st_gdata->tx_skb;
    405		st_gdata->tx_skb = NULL;
    406		return returning_skb;
    407	}
    408	return skb_dequeue(&st_gdata->txq);
    409}
    410
    411/*
    412 * st_int_enqueue - internal Q-ing function.
    413 *	Will either Q the skb to txq or the tx_waitq
    414 *	depending on the ST LL state.
    415 *	If the chip is asleep, then Q it onto waitq and
    416 *	wakeup the chip.
    417 *	txq and waitq needs protection since the other contexts
    418 *	may be sending data, waking up chip.
    419 */
    420static void st_int_enqueue(struct st_data_s *st_gdata, struct sk_buff *skb)
    421{
    422	unsigned long flags = 0;
    423
    424	pr_debug("%s", __func__);
    425	spin_lock_irqsave(&st_gdata->lock, flags);
    426
    427	switch (st_ll_getstate(st_gdata)) {
    428	case ST_LL_AWAKE:
    429		pr_debug("ST LL is AWAKE, sending normally");
    430		skb_queue_tail(&st_gdata->txq, skb);
    431		break;
    432	case ST_LL_ASLEEP_TO_AWAKE:
    433		skb_queue_tail(&st_gdata->tx_waitq, skb);
    434		break;
    435	case ST_LL_AWAKE_TO_ASLEEP:
    436		pr_err("ST LL is illegal state(%ld),"
    437			   "purging received skb.", st_ll_getstate(st_gdata));
    438		kfree_skb(skb);
    439		break;
    440	case ST_LL_ASLEEP:
    441		skb_queue_tail(&st_gdata->tx_waitq, skb);
    442		st_ll_wakeup(st_gdata);
    443		break;
    444	default:
    445		pr_err("ST LL is illegal state(%ld),"
    446			   "purging received skb.", st_ll_getstate(st_gdata));
    447		kfree_skb(skb);
    448		break;
    449	}
    450
    451	spin_unlock_irqrestore(&st_gdata->lock, flags);
    452	pr_debug("done %s", __func__);
    453	return;
    454}
    455
    456/*
    457 * internal wakeup function
    458 * called from either
    459 * - TTY layer when write's finished
    460 * - st_write (in context of the protocol stack)
    461 */
    462static void work_fn_write_wakeup(struct work_struct *work)
    463{
    464	struct st_data_s *st_gdata = container_of(work, struct st_data_s,
    465			work_write_wakeup);
    466
    467	st_tx_wakeup((void *)st_gdata);
    468}
    469void st_tx_wakeup(struct st_data_s *st_data)
    470{
    471	struct sk_buff *skb;
    472	unsigned long flags;	/* for irq save flags */
    473	pr_debug("%s", __func__);
    474	/* check for sending & set flag sending here */
    475	if (test_and_set_bit(ST_TX_SENDING, &st_data->tx_state)) {
    476		pr_debug("ST already sending");
    477		/* keep sending */
    478		set_bit(ST_TX_WAKEUP, &st_data->tx_state);
    479		return;
    480		/* TX_WAKEUP will be checked in another
    481		 * context
    482		 */
    483	}
    484	do {			/* come back if st_tx_wakeup is set */
    485		/* woke-up to write */
    486		clear_bit(ST_TX_WAKEUP, &st_data->tx_state);
    487		while ((skb = st_int_dequeue(st_data))) {
    488			int len;
    489			spin_lock_irqsave(&st_data->lock, flags);
    490			/* enable wake-up from TTY */
    491			set_bit(TTY_DO_WRITE_WAKEUP, &st_data->tty->flags);
    492			len = st_int_write(st_data, skb->data, skb->len);
    493			skb_pull(skb, len);
    494			/* if skb->len = len as expected, skb->len=0 */
    495			if (skb->len) {
    496				/* would be the next skb to be sent */
    497				st_data->tx_skb = skb;
    498				spin_unlock_irqrestore(&st_data->lock, flags);
    499				break;
    500			}
    501			kfree_skb(skb);
    502			spin_unlock_irqrestore(&st_data->lock, flags);
    503		}
    504		/* if wake-up is set in another context- restart sending */
    505	} while (test_bit(ST_TX_WAKEUP, &st_data->tx_state));
    506
    507	/* clear flag sending */
    508	clear_bit(ST_TX_SENDING, &st_data->tx_state);
    509}
    510
    511/********************************************************************/
    512/* functions called from ST KIM
    513*/
    514void kim_st_list_protocols(struct st_data_s *st_gdata, void *buf)
    515{
    516	seq_printf(buf, "[%d]\nBT=%c\nFM=%c\nGPS=%c\n",
    517			st_gdata->protos_registered,
    518			st_gdata->is_registered[0x04] == true ? 'R' : 'U',
    519			st_gdata->is_registered[0x08] == true ? 'R' : 'U',
    520			st_gdata->is_registered[0x09] == true ? 'R' : 'U');
    521}
    522
    523/********************************************************************/
    524/*
    525 * functions called from protocol stack drivers
    526 * to be EXPORT-ed
    527 */
    528long st_register(struct st_proto_s *new_proto)
    529{
    530	struct st_data_s	*st_gdata;
    531	long err = 0;
    532	unsigned long flags = 0;
    533
    534	st_kim_ref(&st_gdata, 0);
    535	if (st_gdata == NULL || new_proto == NULL || new_proto->recv == NULL
    536	    || new_proto->reg_complete_cb == NULL) {
    537		pr_err("gdata/new_proto/recv or reg_complete_cb not ready");
    538		return -EINVAL;
    539	}
    540
    541	if (new_proto->chnl_id >= ST_MAX_CHANNELS) {
    542		pr_err("chnl_id %d not supported", new_proto->chnl_id);
    543		return -EPROTONOSUPPORT;
    544	}
    545
    546	if (st_gdata->is_registered[new_proto->chnl_id] == true) {
    547		pr_err("chnl_id %d already registered", new_proto->chnl_id);
    548		return -EALREADY;
    549	}
    550
    551	/* can be from process context only */
    552	spin_lock_irqsave(&st_gdata->lock, flags);
    553
    554	if (test_bit(ST_REG_IN_PROGRESS, &st_gdata->st_state)) {
    555		pr_info(" ST_REG_IN_PROGRESS:%d ", new_proto->chnl_id);
    556		/* fw download in progress */
    557
    558		add_channel_to_table(st_gdata, new_proto);
    559		st_gdata->protos_registered++;
    560		new_proto->write = st_write;
    561
    562		set_bit(ST_REG_PENDING, &st_gdata->st_state);
    563		spin_unlock_irqrestore(&st_gdata->lock, flags);
    564		return -EINPROGRESS;
    565	} else if (st_gdata->protos_registered == ST_EMPTY) {
    566		pr_info(" chnl_id list empty :%d ", new_proto->chnl_id);
    567		set_bit(ST_REG_IN_PROGRESS, &st_gdata->st_state);
    568		st_recv = st_kim_recv;
    569
    570		/* enable the ST LL - to set default chip state */
    571		st_ll_enable(st_gdata);
    572
    573		/* release lock previously held - re-locked below */
    574		spin_unlock_irqrestore(&st_gdata->lock, flags);
    575
    576		/*
    577		 * this may take a while to complete
    578		 * since it involves BT fw download
    579		 */
    580		err = st_kim_start(st_gdata->kim_data);
    581		if (err != 0) {
    582			clear_bit(ST_REG_IN_PROGRESS, &st_gdata->st_state);
    583			if ((st_gdata->protos_registered != ST_EMPTY) &&
    584			    (test_bit(ST_REG_PENDING, &st_gdata->st_state))) {
    585				pr_err(" KIM failure complete callback ");
    586				spin_lock_irqsave(&st_gdata->lock, flags);
    587				st_reg_complete(st_gdata, err);
    588				spin_unlock_irqrestore(&st_gdata->lock, flags);
    589				clear_bit(ST_REG_PENDING, &st_gdata->st_state);
    590			}
    591			return -EINVAL;
    592		}
    593
    594		spin_lock_irqsave(&st_gdata->lock, flags);
    595
    596		clear_bit(ST_REG_IN_PROGRESS, &st_gdata->st_state);
    597		st_recv = st_int_recv;
    598
    599		/*
    600		 * this is where all pending registration
    601		 * are signalled to be complete by calling callback functions
    602		 */
    603		if ((st_gdata->protos_registered != ST_EMPTY) &&
    604		    (test_bit(ST_REG_PENDING, &st_gdata->st_state))) {
    605			pr_debug(" call reg complete callback ");
    606			st_reg_complete(st_gdata, 0);
    607		}
    608		clear_bit(ST_REG_PENDING, &st_gdata->st_state);
    609
    610		/*
    611		 * check for already registered once more,
    612		 * since the above check is old
    613		 */
    614		if (st_gdata->is_registered[new_proto->chnl_id] == true) {
    615			pr_err(" proto %d already registered ",
    616				   new_proto->chnl_id);
    617			spin_unlock_irqrestore(&st_gdata->lock, flags);
    618			return -EALREADY;
    619		}
    620
    621		add_channel_to_table(st_gdata, new_proto);
    622		st_gdata->protos_registered++;
    623		new_proto->write = st_write;
    624		spin_unlock_irqrestore(&st_gdata->lock, flags);
    625		return err;
    626	}
    627	/* if fw is already downloaded & new stack registers protocol */
    628	else {
    629		add_channel_to_table(st_gdata, new_proto);
    630		st_gdata->protos_registered++;
    631		new_proto->write = st_write;
    632
    633		/* lock already held before entering else */
    634		spin_unlock_irqrestore(&st_gdata->lock, flags);
    635		return err;
    636	}
    637}
    638EXPORT_SYMBOL_GPL(st_register);
    639
    640/*
    641 * to unregister a protocol -
    642 * to be called from protocol stack driver
    643 */
    644long st_unregister(struct st_proto_s *proto)
    645{
    646	long err = 0;
    647	unsigned long flags = 0;
    648	struct st_data_s	*st_gdata;
    649
    650	pr_debug("%s: %d ", __func__, proto->chnl_id);
    651
    652	st_kim_ref(&st_gdata, 0);
    653	if (!st_gdata || proto->chnl_id >= ST_MAX_CHANNELS) {
    654		pr_err(" chnl_id %d not supported", proto->chnl_id);
    655		return -EPROTONOSUPPORT;
    656	}
    657
    658	spin_lock_irqsave(&st_gdata->lock, flags);
    659
    660	if (st_gdata->is_registered[proto->chnl_id] == false) {
    661		pr_err(" chnl_id %d not registered", proto->chnl_id);
    662		spin_unlock_irqrestore(&st_gdata->lock, flags);
    663		return -EPROTONOSUPPORT;
    664	}
    665
    666	if (st_gdata->protos_registered)
    667		st_gdata->protos_registered--;
    668
    669	remove_channel_from_table(st_gdata, proto);
    670	spin_unlock_irqrestore(&st_gdata->lock, flags);
    671
    672	if ((st_gdata->protos_registered == ST_EMPTY) &&
    673	    (!test_bit(ST_REG_PENDING, &st_gdata->st_state))) {
    674		pr_info(" all chnl_ids unregistered ");
    675
    676		/* stop traffic on tty */
    677		if (st_gdata->tty) {
    678			tty_ldisc_flush(st_gdata->tty);
    679			stop_tty(st_gdata->tty);
    680		}
    681
    682		/* all chnl_ids now unregistered */
    683		st_kim_stop(st_gdata->kim_data);
    684		/* disable ST LL */
    685		st_ll_disable(st_gdata);
    686	}
    687	return err;
    688}
    689
    690/*
    691 * called in protocol stack drivers
    692 * via the write function pointer
    693 */
    694long st_write(struct sk_buff *skb)
    695{
    696	struct st_data_s *st_gdata;
    697	long len;
    698
    699	st_kim_ref(&st_gdata, 0);
    700	if (unlikely(skb == NULL || st_gdata == NULL
    701		|| st_gdata->tty == NULL)) {
    702		pr_err("data/tty unavailable to perform write");
    703		return -EINVAL;
    704	}
    705
    706	pr_debug("%d to be written", skb->len);
    707	len = skb->len;
    708
    709	/* st_ll to decide where to enqueue the skb */
    710	st_int_enqueue(st_gdata, skb);
    711	/* wake up */
    712	st_tx_wakeup(st_gdata);
    713
    714	/* return number of bytes written */
    715	return len;
    716}
    717
    718/* for protocols making use of shared transport */
    719EXPORT_SYMBOL_GPL(st_unregister);
    720
    721/********************************************************************/
    722/*
    723 * functions called from TTY layer
    724 */
    725static int st_tty_open(struct tty_struct *tty)
    726{
    727	struct st_data_s *st_gdata;
    728	pr_info("%s ", __func__);
    729
    730	st_kim_ref(&st_gdata, 0);
    731	st_gdata->tty = tty;
    732	tty->disc_data = st_gdata;
    733
    734	/* don't do an wakeup for now */
    735	clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
    736
    737	/* mem already allocated
    738	 */
    739	tty->receive_room = 65536;
    740	/* Flush any pending characters in the driver and discipline. */
    741	tty_ldisc_flush(tty);
    742	tty_driver_flush_buffer(tty);
    743	/*
    744	 * signal to UIM via KIM that -
    745	 * installation of N_TI_WL ldisc is complete
    746	 */
    747	st_kim_complete(st_gdata->kim_data);
    748	pr_debug("done %s", __func__);
    749
    750	return 0;
    751}
    752
    753static void st_tty_close(struct tty_struct *tty)
    754{
    755	unsigned char i;
    756	unsigned long flags;
    757	struct	st_data_s *st_gdata = tty->disc_data;
    758
    759	pr_info("%s ", __func__);
    760
    761	/*
    762	 * TODO:
    763	 * if a protocol has been registered & line discipline
    764	 * un-installed for some reason - what should be done ?
    765	 */
    766	spin_lock_irqsave(&st_gdata->lock, flags);
    767	for (i = ST_BT; i < ST_MAX_CHANNELS; i++) {
    768		if (st_gdata->is_registered[i] == true)
    769			pr_err("%d not un-registered", i);
    770		st_gdata->list[i] = NULL;
    771		st_gdata->is_registered[i] = false;
    772	}
    773	st_gdata->protos_registered = 0;
    774	spin_unlock_irqrestore(&st_gdata->lock, flags);
    775	/*
    776	 * signal to UIM via KIM that -
    777	 * N_TI_WL ldisc is un-installed
    778	 */
    779	st_kim_complete(st_gdata->kim_data);
    780	st_gdata->tty = NULL;
    781	/* Flush any pending characters in the driver and discipline. */
    782	tty_ldisc_flush(tty);
    783	tty_driver_flush_buffer(tty);
    784
    785	spin_lock_irqsave(&st_gdata->lock, flags);
    786	/* empty out txq and tx_waitq */
    787	skb_queue_purge(&st_gdata->txq);
    788	skb_queue_purge(&st_gdata->tx_waitq);
    789	/* reset the TTY Rx states of ST */
    790	st_gdata->rx_count = 0;
    791	st_gdata->rx_state = ST_W4_PACKET_TYPE;
    792	kfree_skb(st_gdata->rx_skb);
    793	st_gdata->rx_skb = NULL;
    794	spin_unlock_irqrestore(&st_gdata->lock, flags);
    795
    796	pr_debug("%s: done ", __func__);
    797}
    798
    799static void st_tty_receive(struct tty_struct *tty, const unsigned char *data,
    800			   const char *tty_flags, int count)
    801{
    802#ifdef VERBOSE
    803	print_hex_dump(KERN_DEBUG, ">in>", DUMP_PREFIX_NONE,
    804		16, 1, data, count, 0);
    805#endif
    806
    807	/*
    808	 * if fw download is in progress then route incoming data
    809	 * to KIM for validation
    810	 */
    811	st_recv(tty->disc_data, data, count);
    812	pr_debug("done %s", __func__);
    813}
    814
    815/*
    816 * wake-up function called in from the TTY layer
    817 * inside the internal wakeup function will be called
    818 */
    819static void st_tty_wakeup(struct tty_struct *tty)
    820{
    821	struct	st_data_s *st_gdata = tty->disc_data;
    822	pr_debug("%s ", __func__);
    823	/* don't do an wakeup for now */
    824	clear_bit(TTY_DO_WRITE_WAKEUP, &tty->flags);
    825
    826	/*
    827	 * schedule the internal wakeup instead of calling directly to
    828	 * avoid lockup (port->lock needed in tty->ops->write is
    829	 * already taken here
    830	 */
    831	schedule_work(&st_gdata->work_write_wakeup);
    832}
    833
    834static void st_tty_flush_buffer(struct tty_struct *tty)
    835{
    836	struct	st_data_s *st_gdata = tty->disc_data;
    837	pr_debug("%s ", __func__);
    838
    839	kfree_skb(st_gdata->tx_skb);
    840	st_gdata->tx_skb = NULL;
    841
    842	tty_driver_flush_buffer(tty);
    843	return;
    844}
    845
    846static struct tty_ldisc_ops st_ldisc_ops = {
    847	.num = N_TI_WL,
    848	.name = "n_st",
    849	.open = st_tty_open,
    850	.close = st_tty_close,
    851	.receive_buf = st_tty_receive,
    852	.write_wakeup = st_tty_wakeup,
    853	.flush_buffer = st_tty_flush_buffer,
    854	.owner = THIS_MODULE
    855};
    856
    857/********************************************************************/
    858int st_core_init(struct st_data_s **core_data)
    859{
    860	struct st_data_s *st_gdata;
    861	long err;
    862
    863	err = tty_register_ldisc(&st_ldisc_ops);
    864	if (err) {
    865		pr_err("error registering %d line discipline %ld",
    866			   N_TI_WL, err);
    867		return err;
    868	}
    869	pr_debug("registered n_shared line discipline");
    870
    871	st_gdata = kzalloc(sizeof(struct st_data_s), GFP_KERNEL);
    872	if (!st_gdata) {
    873		pr_err("memory allocation failed");
    874		err = -ENOMEM;
    875		goto err_unreg_ldisc;
    876	}
    877
    878	/* Initialize ST TxQ and Tx waitQ queue head. All BT/FM/GPS module skb's
    879	 * will be pushed in this queue for actual transmission.
    880	 */
    881	skb_queue_head_init(&st_gdata->txq);
    882	skb_queue_head_init(&st_gdata->tx_waitq);
    883
    884	/* Locking used in st_int_enqueue() to avoid multiple execution */
    885	spin_lock_init(&st_gdata->lock);
    886
    887	err = st_ll_init(st_gdata);
    888	if (err) {
    889		pr_err("error during st_ll initialization(%ld)", err);
    890		goto err_free_gdata;
    891	}
    892
    893	INIT_WORK(&st_gdata->work_write_wakeup, work_fn_write_wakeup);
    894
    895	*core_data = st_gdata;
    896	return 0;
    897err_free_gdata:
    898	kfree(st_gdata);
    899err_unreg_ldisc:
    900	tty_unregister_ldisc(&st_ldisc_ops);
    901	return err;
    902}
    903
    904void st_core_exit(struct st_data_s *st_gdata)
    905{
    906	long err;
    907	/* internal module cleanup */
    908	err = st_ll_deinit(st_gdata);
    909	if (err)
    910		pr_err("error during deinit of ST LL %ld", err);
    911
    912	if (st_gdata != NULL) {
    913		/* Free ST Tx Qs and skbs */
    914		skb_queue_purge(&st_gdata->txq);
    915		skb_queue_purge(&st_gdata->tx_waitq);
    916		kfree_skb(st_gdata->rx_skb);
    917		kfree_skb(st_gdata->tx_skb);
    918		/* TTY ldisc cleanup */
    919		tty_unregister_ldisc(&st_ldisc_ops);
    920		/* free the global data pointer */
    921		kfree(st_gdata);
    922	}
    923}